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 ...