我们有一个脚本定期从各种来源下载文件。我要把它转移到芹菜上,但在这样做时,我想同时利用连接池,但我不知道该怎么做。
我目前的想法是使用请求做这样的事情:
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
但是,在这种情况下,我不确定连接会话是否会跨实例持续存在,或者一旦pickling / unpickling完成后Requests会创建新连接。
最后,我可以在类方法上尝试对任务修饰器的实验性支持,所以像这样:
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
最后一个似乎是最好的方法,我将测试这个;但是,我想知道这里是否有人已经做过类似的事情,或者如果没有,你们中的一个人读到这个可能比上述方法更好。