广播Celery任务仅由每个Worker的一个Subprocess处理

时间:2017-11-03 11:30:57

标签: python rabbitmq queue celery broadcast

编辑:由于缺少替代方案,我只是将任务相乘。我使用Flask作为网络服务器。当我调用Train_network端点时,任务执行的次数与工作人员一样多。

response = [fw.train_network.delay().get() for _ in range(Workers)]

为此,我还从-c 2命令中删除celery worker参数,并将金额放入我的配置

celery.conf.worker_concurrency = cfg.celery_workers

有了他,我总是知道子进程的数量以及应该重复任务的次数。

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

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

修改: 所以,我发现这个任务确实被广播给了所有工人。但是工作人员不是从游泳池/并发中发起的,而是来自终端。

所以,如果我用celery worker ..... -c 2启动多个终端这些芹菜工作者确实接收了广播任务。我觉得哪个好。现在我想把这些任务也传播给芹菜工人内部的PoolWorkers。

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

原始

我一直在阅读用户指南猫芹菜,以便我可以向我的所有员工发送一项任务。

我正在使用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_async(queue='broadcast_learning')执行任务似乎不会将任务发送给所有工作人员 - 而只有一人正在处理它。

启动我的工作人员后,它会监听广播和默认队列,我看到他们在Celery中注册了(尽管有一个奇怪的内部名称)

[queues]
.> bcast.13bebf5c-f69c-40d9-a0e8-73f74efb9114 exchange=broadcast_exchange(fanout) key=celery
.> celery           exchange=celery(direct) key=celery

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

0 个答案:

没有答案