Celerybeatを使用して、いくつかのセカンダリタスクを開始するプライマリタスクを開始しています。すでに両方のタスクを作成しています。
これを簡単に行う方法はありますか? Celeryでは、タスクをタスク内から実行できますか?
私の例:
@task
def compute(users=None):
if users is None:
users = User.objects.all()
tasks = []
for user in users:
tasks.append(compute_for_user.subtask((user.id,)))
job = TaskSet(tasks)
job.apply_async() # raises a IOError: Socket closed
@task
def compute_for_user(user_id):
#do some stuff
compute
はcelerybeatから呼び出されますが、apply_async
を実行しようとするとIOErrorが発生します。何か案は?
最初の質問に答えるには:バージョン2.0から、Celeryは他のタスクからタスクを開始する簡単な方法を提供します。 「二次タスク」と呼ぶものは、「サブタスク」と呼ぶものです。 タスク、サブタスク、コールバックのセット のドキュメントを参照してください。これは@Paperinoがリンクするのに十分親切でした。
バージョン3.0の場合、Celeryは groups を使用するように変更され、その他のタイプの動作になりました。
あなたのコードは、あなたがすでにこのインターフェースに精通していることを示しています。あなたの実際の質問は、「サブタスクのセットを実行しようとすると、「Socket Closed」IOError
が表示されるのはなぜですか?」あなたはあなたのプログラムについて十分な情報を提供していないので、誰もそれに答えることができないと思います。抜粋をそのまま実行することはできません。そのため、お客様が抱えている問題を調査することはできません。 IOError
で提供されるスタックトレースを投稿してください。運がよければ、クラッシャーのサポートをしてくれる人が来ます。
また、バージョン3.0の「TaskSet」はもはや用語ではないので、特別なタイプのサブタスクとしてのグループ、チェーン、コードは新しいものです。 http://docs.celeryproject.org/en/3.1を参照してください。 /whatsnew-3.0.html#group-chord-chain-are-now-subtasks
このようなものを使用できます(3.0のサポート)
g = group(compute_for_user.s(user.id) for user in users)
g.apply_async()