由于任务中有多个 HTTP 请求,我遇到了 Celery 工作人员超时的问题。我不明白为什么。看起来任务只是卡在第一行requests.post
(尽管并非总是如此)。在找到有关请求的切线 SO 答案后,我用以下内容修补了请求库:
#import requests
import eventlet
requests = eventlet.import_patched("requests")
现在一切都运行得非常快,没有问题。
我的问题是:Eventlet做了什么巫毒教巫术来使我的任务按预期工作?
我假设,你的意思是任务超时,就像芹菜的时间限制或软时间限制一样。如果这意味着请求库的超时期限,则以下答案不适用。
如果您使用 eventlet 作为进程池,那么修补只是使您的请求库的行为与非阻塞执行环境中的行为一样。如果您使用 prefork 作为 pocesspool,那么可能是您没有使用 requests.post 调用的响应。在这种情况下,eventlet 修补只是使您的请求库非阻塞。由于它不再阻塞,因此您的任务可以继续前进,因此无论请求库级别发生的响应/超时如何,您都看不到任务超时