芹菜task_success与发件人过滤器

时间:2013-07-20 00:12:06

标签: python signals celery

我正在尝试让发件人过滤器工作,例如

@celery.task
def run_timer(crawl_start_time):
    return crawl_start_time

@task_success.connect
def run_timer_success_handler(sender, result, **kwargs):

    print '##################################'
    print 'in run_timer_success_handler'

以上工作正常,但如果我尝试按发件人过滤,它永远不会起作用:

@task_success.connect(sender='tasks.run_timer')
def run_timer_success_handler(sender, result, **kwargs):

    print '##################################'
    print 'in run_timer_success_handler'

我也尝试过:     @ task_success.connect(发件人= 'run_timer')     @ task_success.connect(发件人= run_timer)     @ task_success.connect(发件人=全局()[ 'run_timer'])

他们都没有工作。

如何有效地使用发送方过滤器来确保为run_timer任务而不是其他任务调用回调。

2 个答案:

答案 0 :(得分:5)

现在最好在函数中过滤发送者。像:

@task_success.connect
def ...
    if sender == '...':
        ...

因为当任务发送者和工作者是不同的python进程时,当前的celery信号实现存在问题。 因为它将您的发件人转换为标识符并将其用于过滤,但芹菜通过字符串名称发送任务。这是问题代码(celery.utils.dispatch.signals):

def _make_id(target):  # pragma: no cover
    if hasattr(target, 'im_func'):
        return (id(target.im_self), id(target.im_func))
    return id(target)

id('tasks.run_timer')与工作进程的id('tasks.run_timer')不同。如果你想要你可以破解它并通过哈希功能重新 id

答案 1 :(得分:1)

http://docs.celeryproject.org/en/latest/userguide/signals.html#task-success ... Sender是执行的任务对象。 (与after_task_publish.sender不同) ... 所以,你应该

@task_success.connect(sender=run_timer)
def ...

它对我有用。祝你好运。