我正在使用Celery to queue jobs from a CGI application I made。我设置它的方式,Celery通过设置CELERYD_CONCURRENCY = 1
或= 2
使每个作业一次运行一次或两次(因此它们不会挤占处理器或从内存中晃动消费)。由于我在StackOverflow上的建议,队列工作得很好。
这些工作中的每一项都需要相当长的时间(连续约30分钟),但具有令人尴尬的可并行性。出于这个原因,我使用Pool.map
来拆分它并同时进行工作。它在命令行中运行良好,我使用新的多芯片芯片运行时间约为5分钟。
不幸的是,有一些限制不允许守护进程有子进程,当我在CGI队列中运行花哨的并行化代码时,我收到此错误:
AssertionError:不允许守护进程生成子女
我注意到other people有had similar questions,但我找不到一个不需要完全放弃Pool.map
并制作更复杂的线程代码的答案。
这里适当的设计选择是什么?我可以使用我的Celery队列轻松运行我的串行作业。我还可以在没有队列的情况下运行更快的并行化作业。我应该如何处理这个问题,是否有可能得到我想要的东西(两者队列和每个作业的并行化)?
我曾经有过一些想法(有些想法很讨厌):
提前多多感谢。
答案 0 :(得分:0)
您需要的是管理
的工作流管理系统(WFMS)等等。
从非常高级的角度来看,WFMS位于像celery这样的任务池之上,并将准备执行的任务提交给池。它还负责打开一个嵌套并相应地在嵌套中提交任务。
我已经开发了一个系统来做到这一点。它被称为pomsets。尝试一下,随时向我发送任何问题。
答案 1 :(得分:0)
我使用基于Twisted with forking和Gearman作业的多处理deamons正常查询。
试着看看Gearman。