我正在尝试让发件人过滤器正常工作。
@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(sender=globals()'run_timer') (@task_success.connect=‘run_timer’) @task_success.connect(sender=run_timer)
它们都不起作用。
如何有效地使用发件人筛选器来确保为run_timer任务而不是其他任务调用by callback。
发布于 2013-09-26 00:19:09
在这种情况下,最好在函数内部过滤发送者。像这样:
@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函数。
发布于 2016-04-19 10:35:38
http://docs.celeryproject.org/en/latest/userguide/signals.html#task-success ...发送者是执行的任务对象。(与after_task_publish.sender不同) ...所以,你应该
@task_success.connect(sender=run_timer)
def ...这对我很管用。祝好运。
https://stackoverflow.com/questions/17757306
复制相似问题