6

さまざまなソースからドキュメントを定期的にダウンロードするスクリプトがあります。これをセロリに移行するつもりですが、同時に接続プーリングを利用したいと思っていましたが、どうすればよいかわかりませんでした。

私の現在の考えは、リクエストを使用して次のようなことをすることです:

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

最後の方法は、この最善のアプローチのように思えます。これをテストします。ただし、ここにいる誰かがこれと同様のことをすでに行っているかどうか、またはそうでない場合は、これを読んでいる人のうちの 1 人が上記の方法の 1 つよりも優れたアプローチを持っているのではないかと考えていました。

4

0 に答える 0