Python 通往工人的路线取决于芹菜的结果?

Python 通往工人的路线取决于芹菜的结果?,python,multithreading,celery,apache-storm,Python,Multithreading,Celery,Apache Storm,我最近一直在使用它,其中包含一个名为字段分组(afaict与芹菜中的概念无关)的概念,其中带有某个键的消息将始终路由到同一个工作者 为了更清楚地理解我的意思,这里是风暴维基 字段分组:流由中指定的字段进行分区 分组。例如,如果流按“用户id”分组 字段中,具有相同“用户id”的元组将始终转到相同的任务, 但是,具有不同“用户id”的元组可能用于不同的任务 例如,从单词列表中读取,我想将以a、b、c开头的单词只路由到辅助进程,d、e、f路由到另一个,等等 之所以希望这样做,可能是因为我希望一个进程

我最近一直在使用它,其中包含一个名为
字段分组
(afaict与芹菜中的概念无关)的概念,其中带有某个键的消息将始终路由到同一个工作者

为了更清楚地理解我的意思,这里是风暴维基

字段分组:流由中指定的字段进行分区 分组。例如,如果流按“用户id”分组 字段中,具有相同“用户id”的元组将始终转到相同的任务, 但是,具有不同“用户id”的元组可能用于不同的任务

例如,从单词列表中读取,我想将以a、b、c开头的单词只路由到辅助进程,d、e、f路由到另一个,等等

之所以希望这样做,可能是因为我希望一个进程负责一组相同数据的数据库读写,这样进程之间就不会出现竞争条件

我正在努力找出在芹菜中实现这一点的最佳方法

到目前为止,我的最佳解决方案是为每个“组”(例如,letters.a、letters.d)使用一个队列,并确保工作进程的数量与队列的数量完全匹配。缺点是每个工人只需运行一个进程,以及工人死亡或工人被添加/删除等各种情况


我不熟悉芹菜,所以如果我提到的概念不正确,请纠正我。

芹菜的意义在于,你不需要管理单个员工

如果需要任务获得数据所有权,则任务应在运行开始时获得所有权


如果你想单独管理员工,可能不要用芹菜。您可能只需要自己编写workers,并使用消息队列(或者storm)。使用正确的工具来完成正确的工作。

这需要一些胶水,但概念如下:

有一种方法可以通过使用将任务直接发送给不同的工作人员。将其设置为
True
将创建到每个工人的路线

我通过使用芹菜.current\u app.control.inspect().ping()或确定活动主机定期确定活动工作人员。e、 g:

>>> hosts = sorted(celery.current_app.control.inspect().ping().keys())
['host5', 'host6']
当我需要通过一个键进行路由时,我会散列该值,然后按工作者的数量进行模化。这将平均分配任务,并将相同的密钥保留给同一个工作者。e、 g:

>>> host_id = hash('hello') % len(hosts)
1
>>> host = hosts[host_id]
'host6'
然后在执行任务时,我只需指定交换和路由密钥,如下所示:

my_task.apply_async(exchange='C.dq', routing_key=host)
有几个缺点:

  • 从我所看到的情况来看,在一个工作进程上设置一个>1的并发性将使每个进程从同一个进程中消耗,从而否定了整个练习。不幸的解决办法是将其保持在1
  • 如果工作进程在
    ping()
    apply\u async
    之间停止,消息将发送到不存在的路由。解决此问题的方法是捕获超时、重新插入可用主机、重新刷新和重新发送

  • 你是怎么和为什么把暴风雪和芹菜结合起来的?风暴听起来像芹菜的替代品。@Marcin我不会把两者结合起来。我只是想在芹菜中使用Storm的一个有用特性。两者在概念上都是相似的系统,例如工人、路由、排队、ACK、结果。芹菜的要点是你不需要管理单个工人。为什么要这样做?任务应该在运行开始时就拥有所有权。如果你想单独管理员工,可能不要用芹菜。您可能只需要自己编写workers,并使用消息队列(或者storm)。为正确的作业使用正确的工具。@alko mapreduce不是实时的!:)芹菜正是我所需要的:Python的实时分布式任务队列。除此之外,我只想对字段进行分组。