AWS лямбда, скрап и ловля исключений - PullRequest
0 голосов
/ 25 февраля 2019

Я выполняю терапию как лямбда-функция AWS.Внутри моей функции мне нужен таймер, чтобы увидеть, работает ли он дольше 1 минуты, и если это так, мне нужно запустить некоторую логику.Вот мой код:

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()

Класс сторожевого таймера, который я взял из этого ответа .Проблема в том, что код никогда не попадает в этот блок except Watchdog, а выдает исключение снаружи:

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

Мне нужно перехватить исключение в функции.Как бы я пошел об этом.PS: я очень плохо знаком с Python.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

В Twisted есть примитивы планирования.Например, эта программа работает около 60 секунд:

from twisted.internet import reactor
reactor.callLater(60, reactor.stop)
reactor.run()
0 голосов
/ 27 февраля 2019

Хорошо, этот вопрос заставил меня немного сойти с ума, вот почему это не работает:

Что делает объект Watchdog, это создает другой поток, в котором исключение возникает, но не обрабатывается (исключение)обрабатывается только в основном процессе).К счастью, у twisted есть несколько интересных функций.

Вы можете сделать это, запустив реактор в другом потоке:

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

Я использую Python 3.7.0

...