为什么Eventlet补丁修复了Celery任务中的requests.post?

时间:2016-06-05 16:29:24

标签: python celery python-requests eventlet

由于我的任务中有多个HTTP请求,我遇到了Celery工作人员超时的问题。我不明白为什么。似乎任务只是卡在第一requests.post行(尽管并非总是如此)。在找到关于请求的切向SO答案后,我用以下代码修补了请求库:

#import requests
import eventlet
requests = eventlet.import_patched("requests")

现在一切都很快,没有问题。

我的问题是:为了让我的任务按预期工作,Eventlet正在做什么巫术巫术?

1 个答案:

答案 0 :(得分:0)

我假设,你的意思是任务超时,如芹菜的时间限制或软时间限制。如果它意味着请求库的超时时间,那么以下答案不适用。

如果您使用eventlet作为processpool,那么该修补只会使您的请求库表现得像在非阻塞执行环境中表现一样。 如果您使用prefork作为pocesspool,那么可能是您没有使用requests.post调用的响应。在这种情况下,eventlet修补只会使您的请求库无阻塞。由于它不再阻止,您的任务可以继续进行,因此您无法看到任务超时,无论请求库级别发生响应/超时