编辑:由于缺少替代方案,我只是将任务相乘。我使用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不使用广播。但无论我尝试什么,它似乎都不起作用。