Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用urllib3或请求和芹菜_Python_Django_Celery_Python Requests_Urllib3 - Fatal编程技术网

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请求。我认为跨任务的资源共享本质上是与芹菜相反的,除非有一个芹菜设计特性来支持这一点。你有没有想出一个解决办法?我也想知道这个问题的答案