Python 芹菜任务\u使用发件人筛选器成功

Python 芹菜任务\u使用发件人筛选器成功,python,signals,celery,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_succes

我正在尝试让发件人筛选器工作,例如

@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'
我还尝试: @任务\u成功。连接(发送方='run\u timer') @任务成功。连接(发送方=运行计时器) @任务\u成功。连接(发送方=globals()['run\u timer'])

它们都不起作用


如何有效地使用发送方筛选器,以确保对运行计时器任务而不是其他任务调用by callback。

在这种情况下,最好现在就对发送方内部函数进行筛选。比如:

@task_success.connect
def ...
    if sender == '...':
        ...
因为当前芹菜信号实现在任务发送者和工作者是不同的python进程时存在问题。 因为它将发送者转换为标识符并用于过滤,但芹菜按字符串名称发送任务。以下是问题代码(芹菜.utils.dispatch.signals):

id('tasks.run\u timer')与辅助进程的id('tasks.run\u timer')不同。如果您愿意,您可以通过散列函数对其进行破解并重新设置id ... Sender是已执行的任务对象。(与after_task_publish.sender不同) ... 所以,你应该

@task_success.connect(sender=run_timer)
def ...
它对我有用。祝你好运

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