什么是使用0mq建立进程之间的双向通信的最正确的方法是什么?我需要创建几个后台进程,它们将等待来自主进程的命令,执行一些计算并将结果返回给主进程。0mq一个一对多的连接
3
A
回答
5
有几个方法可以做到这一点。最直接的方法可能是使用REQ
/REP
套接字。每一个后台进程/工人将有一个REP
插座,你就可以使用一个插座REQ
与他们沟通:
import zmq
def worker(addr):
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind(addr)
while True:
# get message from boss
msg = socket.recv()
# ...do smth
# send back results
socket.send(msg)
if __name__ == '__main__':
# spawn 5 workers
from multiprocessing import Process
for i in range(5):
Process(target=worker, args=('tcp://127.0.0.1:500%d' % i,)).start()
你必须连接到每个工人向他们发送消息,并取回结果:
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect(worker_addr)
socket.send('message')
msg = socket.recv()
另一种方法是使用PUB
/SUB
的消息断火工人和PUSH
/PULL
收获结果:
import zmq
def worker(worker_id, publisher_addr, results_addr):
context = zmq.Context()
sub = context.socket(zmq.SUB)
sub.connect(publisher_addr)
sub.setsockopt(zmq.SUBSCRIBE, worker_id)
push = context.socket(zmq.PUSH)
push.connect(results_addr)
while True:
msg = sub.recv_multipart()[1]
# do smth, send off results
push.send_multipart([worker_id, msg])
if __name__ == '__main__':
publisher_addr = 'tcp://127.0.0.1:5000'
results_addr = 'tcp://127.0.0.1:5001'
# launch some workers into space
from multiprocessing import Process
for i in range(5):
Process(target=worker, args=('worker-%d' % i, publisher_addr, results_addr,)).start()
广播命令到具体工作人员,你会做这样的事情:
context = zmq.Context()
pub = context.socket(zmq.PUB)
pub.bind(publisher_addr)
# send message to worker-1
pub.send_multipart(['worker-1', 'hello'])
拉的结果:
context = zmq.Context()
pull = context.socket(zmq.PULL)
pull.bind(results_addr)
while True:
worker_id, result = pull.recv_multipart()
print worker_id, result
3
考虑使用Request Reply Broker但交换REQ插座到经销商。 DEALER不会阻止发送,并会自动为您的工作人员平衡流量。
在图片Client
将是你的main process
和Service A/B/C
是你的background processes (workers)
。 Main process
应该绑定到一个端点。 Workers
应连接到主进程的端点以接收工作项目。
在工作项目main process
保持列表和发送时间。如果一段时间没有答案,只需重新发送工作项目,因为worker
可能已经死亡。
相关问题
- 1. 的毗连一个一对多的连接时表
- 2. 内连接在MySQL(一对多连接)
- 3. 更新一个多一对多连接器表一下子
- 4. 多一个一对多连接到同一台性能
- 5. MySQL Query多对一连接
- 6. 排序一对多连接
- 7. 学说查询一对多一对多连接表中的一个实体
- 8. JPA一个一对多的连接表的附加信息
- 9. MySQL的左连接多个表的一个一对多的关系
- 10. Hibernate连接映射多对一,多列
- 11. JDBC一对多连接与多选择
- 12. Hibernate的多对一关系到一个连接子类类型
- 13. 单向一个一对多的关系,而不连接表
- 14. 链接到一个静态的0MQ库在VS
- 15. 多对一映射的左连接
- 16. Symfony2多对一 - 一对多没有连接表
- 17. 连接多个对象的属性值代入一个
- 18. NHibernate一对多连接子类
- 19. 双向一对多连接表
- 20. Hibernate组合键和连接(一对多)?
- 21. NHibernate一对多使用连接表
- 22. Jpa一对多使用连接表
- 23. 多对一连接数据框
- 24. 休眠HQL多对一连接
- 25. 一对多连接表与推动
- 26. 在Django中用多个连接对同一个表进行左连接查询
- 27. MySQL的多个多对多连接
- 28. 多个连接到一个列表中
- 29. 多个会话工厂,一个连接?
- 30. SQL:将多个表连接成一个