Python 确保工作进程始终在zeroMQ中终止
我正在使用python绑定使用zeroMQ实现一个管道模式 任务呈扇形分布给工人,工人通过如下无限循环收听新任务:Python 确保工作进程始终在zeroMQ中终止,python,zeromq,Python,Zeromq,我正在使用python绑定使用zeroMQ实现一个管道模式 任务呈扇形分布给工人,工人通过如下无限循环收听新任务: while True: socks = dict(self.poller.poll()) if self.receiver in socks and socks[self.receiver] == zmq.POLLIN: msg = self.receiver.recv_unicode(encoding='utf-8'
while True:
socks = dict(self.poller.poll())
if self.receiver in socks and socks[self.receiver] == zmq.POLLIN:
msg = self.receiver.recv_unicode(encoding='utf-8')
self.process(msg)
if self.hear in socks and socks[self.hear] == zmq.POLLIN:
msg = self.hear.recv()
print self.pid,":", msg
sys.exit(0)
当从接收节点收到消息,确认已收到所有预期结果时,它们将退出
但是,工作人员可能会错过此类消息而无法完成。当员工无法知道(除了通过前面提到的消息,没有其他任务要处理)时,让他们始终完成任务的最佳方式是什么
以下是我为检查工人状态而编写的测试代码:
#-*- coding:utf-8 -*-
"""
Test module containing tests for all modules of pypln
"""
import unittest
from servers.ventilator import Ventilator
from subprocess import Popen, PIPE
import time
class testWorkerModules(unittest.TestCase):
def setUp(self):
self.nw = 4
#spawn 4 workers
self.ws = [Popen(['python', 'workers/dummy_worker.py'], stdout=None) for i in range(self.nw)]
#spawn a sink
self.sink = Popen(['python', 'sinks/dummy_sink.py'], stdout=None)
#start a ventilator
self.V = Ventilator()
# wait for workers and sinks to connect
time.sleep(1)
def test_send_unicode(self):
'''
Pushing unicode strings through workers to sinks.
'''
self.V.push_load([u'são joão' for i in xrange(80)])
time.sleep(1)
#[p.wait() for p in self.ws]#wait for the workers to terminate
wsr = [p.poll() for p in self.ws]
while None in wsr:
print wsr, [p.pid for p in self.ws if p.poll() == None] #these are the unfinished workers
time.sleep(0.5)
wsr = [p.poll() for p in self.ws]
self.sink.wait()
self.sink = self.sink.returncode
self.assertEqual([0]*self.nw, wsr)
self.assertEqual(0, self.sink)
if __name__ == '__main__':
unittest.main()
所有的信息最终都以心跳结束。如果您(作为一名工人或水槽或其他任何人)发现需要使用的组件已失效,您基本上可以尝试连接到其他地方或自杀。所以,如果你作为一个工人发现水槽已经没有了,就退出吧。这也意味着您可以退出,即使接收器仍然存在,但连接已断开。但我不确定你能做得更多,也许可以更合理地设置所有超时…此外,此测试的一个令人讨厌的副作用是它不会完成,如果中断,会留下一堆僵尸进程(工人或接收器)