我正在抓紧地作为AWS Lambda函数。在我的函数内部,我需要有一个计时器来查看它是否运行了超过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()
我从this answer获得的看门狗计时器类。问题是代码从不击中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的新手。
答案 0 :(得分:2)
这个问题让我有些疯狂,这就是为什么这不起作用:
'Signed in'
对象的作用是创建另一个引发异常但未处理的线程(该异常仅在主进程中处理)。幸运的是,twisted具有一些简洁的功能。
您可以在另一个线程中运行反应堆:
Watchdog
我正在使用python 3.7.0
答案 1 :(得分:0)
Twisted具有调度原语。例如,该程序运行约60秒钟:
from twisted.internet import reactor
reactor.callLater(60, reactor.stop)
reactor.run()