Python 在芹菜任务之间共享公共实用程序功能

Python 在芹菜任务之间共享公共实用程序功能,python,django,celery,django-celery,celery-task,Python,Django,Celery,Django Celery,Celery Task,我已经在芹菜中完成了一系列任务,所有任务都通过画布链连接起来 @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):

我已经在芹菜中完成了一系列任务,所有任务都通过
画布链连接起来

@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
    ...
在没有任务阻塞的情况下,最好的方法是什么? 例如,我可以用调用
cleanup\u和\u notify\u用户(任务\u数据)
来替换
runcommon cleanup function
?如果来自多个工作者的多个任务试图同时调用该函数,会发生什么情况

每个工人都有自己的副本吗?我显然对这里的几个概念有点困惑。非常感谢您的帮助


提前感谢大家。

在芹菜任务中,您只是在编写python代码,因此该任务有自己的流程,该函数将只是针对每个任务实例化,就像在任何基本OOP逻辑中一样。 当然,如果此清理功能尝试删除共享资源(如系统文件夹或数据库行),则最终会遇到需要以其他方式解决的外部资源并发访问问题,例如在fylesystem中,您可以为每个任务创建一个沙箱。
希望这有助于任务在它们自己的进程中运行,这样它们就可以在Python方面得到足够的隔离。至于如何同时修改外部资源的行为。。。很难说。您可能想在问题中添加操作系统,并考虑外部同步/排除机制,如创建工作标记文件或操作系统多进程信令机制。@JLPeyret我只关心在任务失败时“协调”对回退功能的访问的某种机制。。。顺便说一句,我使用的是一台ubuntu机器。在功能层面上并不重要。在功能正在修改的级别执行。即func X&Y两个删除文件夹都可能是一个问题,无论它们是不同的函数。我的意思是,既然你不在线程上,请注意线程上下文中给出的Python指令。我对锁之类的东西不太在行,所以我不想让你出错。然而,Python有一种称为多进程的可选并发机制,它不是基于线程的,因此对于您的上下文来说是芹菜式的。这个搜索,[python]锁多进程,可能会有一些启发。另请参阅另一种方法,即告诉芹菜不要同时运行某些任务(在您的情况下也是如此),我认为这可能是最简单的方法。@JLPeyret谢谢您的提示。我会调查的。