したがって、作業ディレクトリを作成し、そこですべての作業を行うタスクがあります。タスクはサーバー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が必要なため、どのように使用できるかわかりません。
他のアイデアは大歓迎です。