2013-03-26 2 views
1

Итак, у меня есть задача, которая создает рабочий каталог и выполняет всю свою работу. Задача вызывается от сервера A и выполнена на рабочих серверах.Задача задачи сельдерея в обработчике task_revoked

Мне нужно убедиться, что рабочий каталог удален после завершения задачи/отменил.

Я добавил задание отозвана обработчика и это выглядит следующим образом:

@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'} 

Моя проблема когда сервер А отменяет задачу я не могу выдать очистки каталога работы в отозвана обработчика, поскольку он Безразлично У меня есть task_id.

Есть ли способ получить идентификатор задачи из этого конкретного обработчика сигнала? Немного other Signals имейте это, и я посмотрел источник, где они выданы, и по какой-то причине этот Сигнал не снабжен task_id.

Задача sender содержит функцию trace_task: {'__trace__': <function trace_task at 0x3ee8230>}, но я не вижу, как я могу ее использовать, поскольку сама функция требует task_id.

Любые другие идеи приветствуются.

ответ

1

Я думаю, что здесь вы используете более старую версию сельдерея, у которой нет поддержки этого первого аргумента «запрос».

Проблема с восходящим потоком, которая добавила это [1]; До этого я думаю, что вам не повезло, и нет способа получить task_id, к сожалению.

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

+0

Поздно лучше, чем никогда, я полагаю =) – JayLev

Смежные вопросы