Python 广播芹菜任务仅由每个工作者的一个子进程处理

Python 广播芹菜任务仅由每个工作者的一个子进程处理,python,rabbitmq,queue,celery,broadcast,Python,Rabbitmq,Queue,Celery,Broadcast,编辑:在没有替代方案的情况下,我只需将任务相乘即可。我正在使用Flask作为Web服务器。当我调用Train_网络端点时,任务的执行次数与工作人员的执行次数相同 response = [fw.train_network.delay().get() for _ in range(Workers)] 为了实现这一点,我还从芹菜工人命令中删除了-c2参数,并将金额放入我的配置中 celery.conf.worker_concurrency = cfg.celery_workers 有了它,我总是知

编辑:在没有替代方案的情况下,我只需将任务相乘即可。我正在使用Flask作为Web服务器。当我调用Train_网络端点时,任务的执行次数与工作人员的执行次数相同

response = [fw.train_network.delay().get() for _ in range(Workers)]
为了实现这一点,我还从
芹菜工人
命令中删除了
-c2
参数,并将金额放入我的配置中

celery.conf.worker_concurrency = cfg.celery_workers
有了它,我总是知道子流程的数量以及任务应该重复多少次

如果有更好的方法解决这个问题,我会用答案更新帖子。或者其他人可以提供见解

编辑:基本上,我需要从所有子流程访问一组特定的变量,这些变量应该在这些流程之间共享。或者,如果每个进程都有自己的变量,我需要能够通过执行任务来修改所有这些变量

编辑: 因此,我发现这项任务确实是向所有工人广播的。但不是从池/并发启动的工人,而是从终端启动的工人

因此,如果我使用
芹菜工人启动多个终端-C2
这些芹菜工人确实接收广播任务。我想这很好。现在我想把这些任务也广播给芹菜工人里面的游泳池工人

基本上,我加载一个模型,我想在所有池工作人员上重新加载该模型

原件

我一直在阅读《猫芹菜用户指南》,这样我就可以把一个任务发送给我所有的员工

我使用的是RabbitMQ和everzthing elso,工作正常,但广播任务只由一个工作人员处理

我定义了交换和队列

exchange = Exchange('broadcast_exchange', type='fanout')
celery.conf.task_queues = (Broadcast(name='broadcast_learning', exchange=exchange),)
以及任务路线:

celery.conf.task_routes = {
 'fworker.train_network':
    {
        'queue':'broadcast_learning',
        'exchange':'broadcast_exchange'
    },
 ....
}
但是使用
.delay()
.apply\u async(queue='broadcast\u learning')
执行任务似乎不会将任务发送给所有工作人员,而是只有一个工作人员在处理它

启动worker后,它会侦听广播和默认队列,我看到它们在芹菜中注册(尽管内部名称很奇怪)


我已经从Redis后端更改为RabbitmQ,因为一些答案表明Redis不支持广播。但无论我怎么做,它似乎都不起作用。

我遇到了同样的问题,我想向每个工作的子进程发送广播以重新加载配置,但它无法工作,只有一个子进程可以工作。您是否尝试重新加载配置复制任务?响应=[fw.train_network.delay().get(),用于范围内的(工作者)]。它有黑客行为,但适用于meI的问题相同。它不适用于所有子流程。
[queues]
.> bcast.13bebf5c-f69c-40d9-a0e8-73f74efb9114 exchange=broadcast_exchange(fanout) key=celery
.> celery           exchange=celery(direct) key=celery