使用urllib3或请求和Celery

时间:2012-09-07 17:00:30

标签: 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


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

最后一个似乎是最好的方法,我将测试这个;但是,我想知道这里是否有人已经做过类似的事情,或者如果没有,你们中的一个人读到这个可能比上述方法更好。

0 个答案:

没有答案