Prowadzę pisancję jako funkcję Lambda AWS. Wewnątrz mojej funkcji muszę mieć zegar, aby zobaczyć, czy działa dłużej niż 1 minutę, a jeśli tak, muszę uruchomić trochę logiki. Oto mój kod:

def handler():
    x = 60
    watchdog = Watchdog(x)
    try:
        runner = CrawlerRunner()
        runner.crawl(MySpider1)
        runner.crawl(MySpider2)
        d = runner.join()
        d.addBoth(lambda _: reactor.stop())
        reactor.run()
    except Watchdog:
        print('Timeout error: process takes longer than %s seconds.' % x)
        # some other logic here
    watchdog.stop()

Klasa Timera Watchdog wziąłem z Ta odpowiedź. Problem polega na tym, że kod nigdy nie trafia, że blok except Watchdog, ale raczej rzuca wyjątek na zewnątrz:

Exception in thread Thread-1:
 Traceback (most recent call last):
   File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
     self.run()
   File "/usr/lib/python3.6/threading.py", line 1182, in run
     self.function(*self.args, **self.kwargs)
   File "./functions/python/my_scrapy/index.py", line 174, in defaultHandler
     raise self
 functions.python.my_scrapy.index.Watchdog: 1

Muszę złapać wyjątek w funkcji. Jak pójdę na to. PS: Jestem bardzo nowy w Pythonie.

0
terreb 25 luty 2019, 17:22

2 odpowiedzi

Najlepsza odpowiedź

W porządku, to pytanie miałem trochę szalone, oto dlaczego to nie działa:

Obiekt Na szczęście skręcona ma kilka schludnych funkcji.

Możesz to zrobić prowadzące reaktor w innym wątku:

import time
from threading import Thread
from twisted.internet import reactor

runner = CrawlerRunner()
runner.crawl(MySpider1)
runner.crawl(MySpider2)
d = runner.join()
d.addBoth(lambda _: reactor.stop())
Thread(target=reactor.run, args=(False,)).start()  # reactor will run in a different thread so it doesn't lock the script here

time.sleep(60)  # Lock script here

# Now check if it's still scraping
if reactor.running:
    # do something
else:
    # do something else

Używam Pythona 3.7.0

2
Rafael Almeida 27 luty 2019, 12:17

Twisted ma planowanie prymitywów. Na przykład ten program działa przez około 60 sekund:

from twisted.internet import reactor
reactor.callLater(60, reactor.stop)
reactor.run()
0
Jean-Paul Calderone 27 luty 2019, 13:32