我们有一个脚本,可以定期从各种来源下载文档。我打算把它移到 celery 上,但是在这样做的同时,我想同时利用连接池,但我不知道该怎么做。
我目前的想法是使用请求做这样的事情:
import celery
import requests
s = requests.session()
@celery.task(retry=2)
def get_doc(url):
doc = s.get(url)
#do stuff with doc
但我担心连接会无限期地保持打开状态。
只要我正在处理新文档,我真的只需要连接保持打开状态。
所以这样的事情是可能的:
import celery
import requests
def get_all_docs()
docs = Doc.objects.filter(some_filter=True)
s = requests.session()
for doc in docs: t=get_doc.delay(doc.url, s)
@celery.task(retry=2)
def get_doc(url):
doc = s.get(url)
#do stuff with doc
但是,在这种情况下,我不确定连接会话是否会跨实例持续存在,或者一旦酸洗/解酸洗完成,请求是否会创建新连接。
最后,我可以在类方法上尝试对任务装饰器的实验性支持,如下所示:
import celery
import requests
class GetDoc(object):
def __init__(self):
self.s = requests.session()
@celery.task(retry=2)
def get_doc(url):
doc = self.s.get(url)
#do stuff with doc
最后一个似乎是最好的方法,我将对此进行测试;但是,我想知道这里是否有人已经做过类似的事情,或者如果没有,你们中的一个人阅读这篇文章可能有比上述方法之一更好的方法。