我正在复制zguide2的零{m} Divide & Conquer example。它使用呼吸机将任务推送给几个将结果发送到接收器的工作人员。
一切正常。但是,如果我模拟较慢的客户端或非常不平衡的任务,则运行时间远非最佳。例如,这可以通过添加行
来实现if(task_nbr % cpu_count() == 0):
workload *= 4
ventilator后的workload = random.randint(1, 100)
。
我尝试将接收器(工作人员)和发送器(呼吸机)的高水位降低,但没有改善运行时间。
错误可能在于选择套接字类型" PUB" /" PULL"?
如果需要,我可以附上一个最小工作示例,但由于工作者 - 呼吸机 - 水槽结构,它有点冗长(约150行)。
答案 0 :(得分:0)
在这种情况下,最好使用ROUTER and REQ sockets。这在python with
中是可能的client = context.socket(zmq.ROUTER)
和
worker = context.socket(zmq.REQ)
Jeremy Avnet的一个完整成功的例子可以找到in the zguide。可以观察到,即使添加了问题的代码,运行时也将接近最优。
部分中也介绍了为什么会这样做工作人员在启动时以及完成每项任务后发送“就绪”消息。代理逐个读取这些消息。每次读取消息时,它都来自上次使用的工作者。因为我们使用的是ROUTER套接字,所以我们可以获得一个标识,然后我们可以使用该标识将任务发送给工作者