在Celery任务之间共享一个通用实用程序功能

时间:2015-04-25 15:52:55

标签: python django celery django-celery celery-task

我在Celery中有很多任务都使用canvas chain进行连接。

@shared_task(bind=True)
def my_task_A(self):
    try:
        logger.debug('running task A')
        do something
    except Exception:
        run common cleanup function

@shared_task(bind=True)
def my_task_B(self):
    try:
        logger.debug('running task B')
        do something else
    except Exception:
        run common cleanup function

...

到目前为止一切顺利。问题是我正在寻找使用这样的通用实用函数的最佳实践:

def cleanup_and_notify_user(task_data):
    logger.debug('task failed')
    send email
    delete folders
    ...

没有任务阻止,最好的办法是什么? 例如,我可以通过调用run common cleanup function来替换cleanup_and_notify_user(task_data)吗?如果来自多个工作人员的多个任务试图同时调用该函数会发生什么?

每个工人都有自己的副本吗?我显然对这里的一些概念感到困惑。非常感谢任何帮助。

提前谢谢大家。

1 个答案:

答案 0 :(得分:2)

从celery任务中你只是编写python,因此任务有自己的进程,函数将只为每个任务实例化,就像在任何基本的OOP逻辑中一样。 当然,如果此清理功能尝试删除系统文件夹或数据库行等共享资源,则最终会导致需要以其他方式解决的外部资源的并发访问问题,例如在fylesystem的情况下,您可以为每个任务创建一个沙箱。 希望这有帮助