2012-03-24 87 views
3

我有一个使用python和zeromq的工作应用程序,我想对其进行优化。使用python和zeromq分发任务

简而言之,主节点发送相同的请求给所有的工人(约200),然后收集答案。根据答案,它将消息发送回一个节点,节点回应。

现在我实现了一个非常简单的模式。每个工作人员有一个REP套接字,服务器有一个REQ套接字列表。服务器遍历所有发送一般消息的套接字,然后迭代所有套接字以收集答案。最后,服务器根据答案选择一个工作人员,向其发送消息并等待答复。

这当然很慢。最慢的部分发送200次相同的消息。收集也很慢。我发现分发任务和收集答案的解决方案确实实现了负载均衡,这不是我所需要的。我需要每个工作人员收到信息并作出回应。

这种情况推荐的模式是什么?

谢谢

+0

你是什么意思“这种情况推荐的模式是什么?” – Marcin 2012-03-24 15:07:05

+0

例如,如果您必须处理独立任务,则可以使用呼吸机模式来分配此处所述的任务http://taotetek.wordpress.com/2011/02/02/python-multiprocessing-with-zeromq/ – Hernan 2012-03-24 15:41:44

+0

我知道一个模式是什么。你还没有真正解释你在做什么,你当前解决方案的哪些部分是必需的,甚至没有解释为什么分发你的消息很慢。 “分发东西速度慢”的经典解决方案是不分发东西,或者做得更少。 – Marcin 2012-03-24 16:00:12

回答

0

我不知道zmq。这里有一个模式,可能无法正常工作,刚上手:

主节点发送到所有员工(约200)相同的请求

主PUB绑定*:3140发送

工人SUB连接MASTERHOST:3140订阅的recv

当时收集的答案

工人PUSH连接MASTERHOST:3141发送

主PULL绑定*:3141的recv

基于答案,它发送一条信息给一个节点,该节点的答案回来。

主REQ连接workerhost:3142发送的recv

工人REP绑定*:3142的recv发送

+0

我终于有一段时间来实现和测试这个。第一部分(分发相同任务)比使用pub/sub发布快100倍,而不是循环200个套接字。第二部分(收集答案)仍然缓慢(需要8毫秒)。我在做的是在pull套接字中调用recv 200次。有没有办法告诉zeromq:“等待200条消息并在准备就绪时将它们作为数组返回?”? – Hernan 2012-03-31 20:15:44

+0

为什么要“等待200条消息并在准备好时将它们作为数组返回”比您现在正在做的更快?除非有其他事情让你放慢速度,否则我认为只有当你使用很多线程来拉取消息时,速度才会更快,你可以试试。 – 2012-04-10 19:46:39

+2

@AaronWatters:0MQ套接字*不*线程安全。 **不要**跨线程分享它们。 – jfs 2012-04-11 18:34:51

2

如果每个工人应该需要不同的工作,酒吧/子不会工作。你需要的是一个工作池实现。您可以按循环方式推出作业(只需使用绑定在服务器上的推送套接字,并让每个客户端从中拉出,zeromq将执行循环)或者让每个工作人员从服务器请求作业(如果工作至少是一些最小的复杂性,工作之间的差异很大,这是一个更好的方法。有在其主页上的zeromq指南和网上的例子不胜枚举:

具体实现还取决于关于你是否需要可靠地处理工作。

+0

谢谢,但正如我的问题所述,每个工作人员都做同样的事情(但在他们自己的数据部分)。 – Hernan 2012-03-31 20:12:59