【发布时间】:2022-11-16 11:36:52
【问题描述】:
我有一个芹菜任务,软限制为 10,硬限制为 32:
from celery.exceptions import SoftTimeLimitExceeded
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
@app.task(bind=True, acks_late=False, time_limit=32, soft_time_limit=10)
def my_task(self, **kwargs):
try:
if 'twisted.internet.reactor' in sys.modules:
del sys.modules['twisted.internet.reactor']
settings = get_project_settings()
process = CrawlerProcess(settings)
process.crawl(**kwargs)
process.start()
except SoftTimeLimitExceeded as te:
print('Time Exceeded...')
上面的代码按预期执行。但是当爬取时间较长,达到软限制时,不会触发异常。继续抓取,然后达到硬限制并抛出此错误:
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/billiard/pool.py", line 684, in on_hard_timeout
raise TimeLimitExceeded(job._timeout)
billiard.exceptions.TimeLimitExceeded: TimeLimitExceeded(32,)
我什至无法从任务内部捕获此错误。作为测试,我用 time.sleep(50) 替换了 process.start() 命令,因此没有开始爬网,但同时出现了很长的延迟:
@app.task(bind=True, acks_late=False, time_limit=32, soft_time_limit=10)
def my_task(self, **kwargs):
try:
if 'twisted.internet.reactor' in sys.modules:
del sys.modules['twisted.internet.reactor']
settings = get_project_settings()
process = CrawlerProcess(settings)
process.crawl(**kwargs)
time.sleep(50)
except SoftTimeLimitExceeded as te:
print('Time Exceeded...')
然后SoftTimeLimitExceeded被抓住了。为什么会这样?
版本
芹菜==5.2.7
Scrapy==2.6.1
【问题讨论】:
标签: python exception scrapy celery taskmanager