我在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)
吗?如果来自多个工作人员的多个任务试图同时调用该函数会发生什么?
每个工人都有自己的副本吗?我显然对这里的一些概念感到困惑。非常感谢任何帮助。
提前谢谢大家。
答案 0 :(得分:2)
从celery任务中你只是编写python,因此任务有自己的进程,函数将只为每个任务实例化,就像在任何基本的OOP逻辑中一样。 当然,如果此清理功能尝试删除系统文件夹或数据库行等共享资源,则最终会导致需要以其他方式解决的外部资源的并发访问问题,例如在fylesystem的情况下,您可以为每个任务创建一个沙箱。 希望这有帮助