“分而治之”中的zeromq负载均衡

时间:2014-11-25 15:10:39

标签: python message-queue zeromq

我正在复制zguide2的零{m} Divide & Conquer example。它使用呼吸机将任务推送给几个将结果发送到接收器的工作人员。

一切正常。但是,如果我模拟较慢的客户端或非常不平衡的任务,则运行时间远非最佳。例如,这可以通过添加行

来实现
if(task_nbr % cpu_count() == 0):
        workload *= 4

ventilator后的workload = random.randint(1, 100)

我尝试将接收器(工作人员)和发送器(呼吸机)的高水位降低,但没有改善运行时间。

错误可能在于选择套接字类型" PUB" /" PULL"?

如果需要,我可以附上一个最小工作示例,但由于工作者 - 呼吸机 - 水槽结构,它有点冗长(约150行)。

1 个答案:

答案 0 :(得分:0)

在这种情况下,最好使用ROUTER and REQ sockets。这在python with

中是可能的
client = context.socket(zmq.ROUTER)

worker = context.socket(zmq.REQ)

Jeremy Avnet的一个完整成功的例子可以找到in the zguide。可以观察到,即使添加了问题的代码,运行时也将接近最优。

The Load Balancing Pattern

部分中也介绍了为什么会这样做
  

工作人员在启动时以及完成每项任务后发送“就绪”消息。代理逐个读取这些消息。每次读取消息时,它都来自上次使用的工作者。因为我们使用的是ROUTER套接字,所以我们可以获得一个标识,然后我们可以使用该标识将任务发送给工作者