2013-07-20 24 views
2

我想让发件人过滤器工作,例如芹菜task_success与发件人过滤器

@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(sender = run_timer) @ task_success.connect(sender = globals()['run_timer'])

它们都不工作。

如何有效使用发件人筛选器以确保通过回调调用run_timer任务而不是其他人。

回答

4

现在在这种情况下过滤发件人函数更好。像:

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

因为当前任务发送者和工作者是不同的python进程当前芹菜信号执行有问题。 因为它将您的发件人转换为标识符并将其用于过滤,但芹菜通过字符串名称发送任务。这里的问题是代码(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')。如果你愿意,你可以破解它,并通过散列函数

+2

我不得不使用'sender.name'来让这个工作。 –