python - Django & Celery - 跨多个方法和文件发送信号
问题描述
问题
我有一个 Django + Celery 应用程序,并试图获得一个冗长的方法来在 Celery 任务中运行。
目标
我想要
1)将一整行执行 - 跨多个类和文件调用 - 放入芹菜任务中。同时,该应用程序应继续为用户提供服务。
2)当 Celery 任务完成时发回信号,以便我可以更新 UI。
问题
尽管搜索了文档、示例和帮助站点,但我无法使其正常工作。
我不知道要使用哪些信号,如何注册它们,如何编写相关的方法来正确接收这些信号,并在完成后做出响应。
从 Celery 文档中我不清楚如何完成所有这些:有很多很多可用的信号和装饰器,但很少说明哪些信号和装饰器适合这一系列事件。
请求帮助
任何一个
- 指向一些可以提供帮助的资源(更好的文档、指向适合我用例的示例的链接等),
或者
- 关于哪些信号适合使用、在哪里使用以及为什么使用的一些第一手帮助。
这是我在 StackOverflow 上的第一篇文章,所以提前感谢您的善意和耐心。
所需的执行路径:
1) views.py : 通过 GET 或 POST 获取输入
SomeMethod:向 TaskManager 中的 staticmethod 发送信号(位于 TaskManager.py 中)以使用参数启动任务
2)TaskManager.py:处理信号,跟踪正在运行的任务
SignalProcessor:接收信号,从 kwargs 中提取参数,在 tasks.py 中调用适当的方法。
任务列表:记下任务列表中的任务,以便我知道它正在运行以及在哪里运行。
3) 任务.py
@shared_task HandleTheTask(arg1, arg2):
依次调用其他文件/类中相应的方法序列,最终在很多方法中多次写入数据库。这些其他方法不在 tasks.py 中。
当 tasks.py 中的方法完成冗长的任务时,向 TaskManager 发送信号。
4) 任务管理器.py
SignalProcessor:接收task_complete信号,从TaskList中移除相应的任务。
我已经尝试过的
- 将带有 @task 或 @shared_task 装饰器的HandleTheTask(arg1, arg2)放入 tasks.py。
我试过从SignalProcessor方法调用HandleTheTask.delay(arg1, arg2) 。
结果:什么都没有发生。该应用程序继续执行,但冗长的任务不会。Celery 没有注意到这个调用并且从不执行它。
这可能是因为我要运行的方法在另一个进程中?
- 将中间方法放入 tasks.py 中,该方法回调 TaskManager.py 以运行冗长的任务。
结果:如上。
- 查找Celery Signals以正确地跨进程发出信号:这看起来是正确的解决方案,但文档信息量大,指导量少。
我咨询过的资源
我已经看过一堆文档和帮助网站。以下是我咨询过的一些资源:
- https://docs.celeryproject.org/en/stable/userguide/signals.html
- https://medium.com/analytics-vidhya/integrating-django-signals-and-celery-cb2876ebd494
- 我如何知道 celery 后台进程在 django 代码中是否成功。如果成功我想渲染一个html页面
- 捕获从 celery 任务发送的 django 信号
- 芹菜中的 Django 信号
欢迎任何帮助。谢谢!