Python 使用urllib3或请求和芹菜
我们有一个脚本,可以定期从各种来源下载文档。我打算把这个移到芹菜上,但在这样做的同时,我想利用连接池,但我不知道如何去做 我目前的想法是使用请求执行类似的操作:Python 使用urllib3或请求和芹菜,python,django,celery,python-requests,urllib3,Python,Django,Celery,Python Requests,Urllib3,我们有一个脚本,可以定期从各种来源下载文档。我打算把这个移到芹菜上,但在这样做的同时,我想利用连接池,但我不知道如何去做 我目前的想法是使用请求执行类似的操作: 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
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
最后一个似乎是最好的方法,我将对此进行测试;然而,我想知道这里是否有人已经做过类似的事情,或者如果没有,你们中的一位阅读本文的人可能有一个比上述方法更好的方法。我怀疑你们是对的。我不是芹菜内部运作方面的专家,但据我所知,每项工作都由不同的工作人员执行,您无法保证执行google.com请求的工作人员A也会执行下一个google.com请求。我认为跨任务的资源共享本质上是与芹菜相反的,除非有一个芹菜设计特性来支持这一点。你有没有想出一个解决办法?我也想知道这个问题的答案