さまざまなソースからドキュメントを定期的にダウンロードするスクリプトがあります。これをセロリに移行するつもりですが、同時に接続プーリングを利用したいと思っていましたが、どうすればよいかわかりませんでした。
私の現在の考えは、リクエストを使用して次のようなことをすることです:
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 つよりも優れたアプローチを持っているのではないかと考えていました。