3

したがって、作業ディレクトリを作成し、そこですべての作業を行うタスクがあります。タスクはサーバーAから呼び出され、ワー​​カーサーバーで実行されます。

タスクが完了/キャンセルされたら、作業ディレクトリが削除されていることを確認する必要があります。

タスクが取り消されたハンドラーを追加しました。次のようになります。

@task
def my_task(value):

    task_id  = current_task.request.id
    work_dir = os.path.join(BASE_WORK_DIR, task_id)
    os.makedirs(work_dir)

    try:
        # Do work...
    finally:
        shutil.rmtree(work_dir)


@task_revoked.connect(sender=my_task)
def my_task_revoked_handler(*args, **kwargs):
    # FIXME: delete work_dir

    print args
    # ()

    print kwargs
    # {'terminated': True, 'signal': <Signal: Signal>, 'expired': False, 'sender': <@task: myapp.core.tasks.my_task>, 'signum': '15'}

私の問題は、サーバーAがタスクをキャンセルしたときに、タスクIDがないため、取り消されたハンドラーの作業ディレクトリのクリーンアップを発行できないことです。

この特定のシグナルハンドラーからタスクIDを取得する方法はありますか? 他のいくつかのSignalにはそれらがあり、これらが発行されるソースを調べましたが、何らかの理由でこのSignalにはtask_idが提供されていません。

提供されsenderたタスクにはtrace_task関数が含まれていますが{'__trace__': <function trace_task at 0x3ee8230>}、関数自体にtask_idが必要なため、どのように使用できるかわかりません。

他のアイデアは大歓迎です。

4

1 に答える 1

1

ここで起こっているのは、この最初の「リクエスト」引数をサポートしていない古いバージョンのセロリを使用していることだと思います。

これを追加した上流の問題は[1]でした。その前は、運が悪かったので、残念ながらtask_idを取得する方法はないと思います。

[1] https://github.com/celery/celery/issues/1555

于 2013-11-14T12:51:10.600 に答える