首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带发件人过滤器的芹菜task_success

带发件人过滤器的芹菜task_success
EN

Stack Overflow用户
提问于 2013-07-20 08:12:06
回答 2查看 2.3K关注 0票数 3

我正在尝试让发件人过滤器正常工作。

代码语言:javascript
复制
@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'

上面的方法运行良好,但如果我尝试按发件人进行过滤,它永远不会起作用:

代码语言:javascript
复制
@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。

EN

回答 2

Stack Overflow用户

发布于 2013-09-26 00:19:09

在这种情况下,最好在函数内部过滤发送者。像这样:

代码语言:javascript
复制
@task_success.connect
def ...
    if sender == '...':
        ...

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

代码语言:javascript
复制
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函数。

票数 4
EN

Stack Overflow用户

发布于 2016-04-19 10:35:38

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

代码语言:javascript
复制
@task_success.connect(sender=run_timer)
def ...

这对我很管用。祝好运。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17757306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档