[英]python multiprocessing child process trigger parent event or method
我正在使用多处理来创建一个子进程,然后该子进程将花费一些时间,并且可能会永远不会结束。
我想做的是,当子进程完成一个步骤时,它将触发父进程的事件或仅调用某些函数。
这是我脚本的一部分:
class WorkerProcess(multiprocessing.Process):
def __init__(self, port, addresslist, result_queue):
multiprocessing.Process.__init__(self)
self.exit = multiprocessing.Event()
self.serialPort = port
self.addressList = addresslist
self.sch = SerialCommunication(self.serialPort, self.addressList)
self.result_queue = result_queue
def run(self):
while not self.exit.is_set():
self.sch.RegularLoadInfo()
self.result_queue.put(self.sch.rawData)
# here trigger event or method in parent process, or let the queue put trigger it
def shutdown(self):
try:
self.sch.stopSerial()
except Exception:
print(Exception)
self.exit.set()
class DataExchange(object):
def __init__(self):
self._serialOn = False
self.workerSerial = None
def get_serialOn(self):
return self._serialOn
def set_serialOn(self, value):
self._serialOn = value
if self.serialOn == True:
result = multiprocessing.Queue()
self.workerSerial = WorkerProcess(self.serialPort, self.addressList, result)
self.workerSerial.daemon = True
self.workerSerial.start()
elif self.serialOn == False:
self.workerSerial.shutdown()
serialOn = property(get_serialOn, set_serialOn)
def OnUpdate(self, event):
# triggered by child process
# do something
pass
提前致谢。
您不能直接在另一个进程中调用方法,但是有两种可能性:
您需要设置一个queue
以从子级与父级进行通信(如果需要双向通信,则需要通过pipe
进行通信),然后设置父级块(运行get()
),直到子级发送数据(运行put()
)。
由于您已经在代码中设置了队列result
, result
您要么想要将其放入队列中,要么将另一个队列WorkerProcess
给WorkerProcess
的__init__
构造WorkerProcess
。
在父进程中执行以下操作:
result = multiprocessing.Queue()
self.workerSerial = WorkerProcess(self.serialPort, self.addressList, result)
self.workerSerial.daemon = True
self.workerSerial.start()
while True:
event = result.get()
if event is None:
break
if event == 'update':
self.OnUpdate()
self.workerSerial.terminate()
您需要定义孩子如何发送他发送了最后一个元素(又称“前哨”)的方式,我在上面的示例代码中选择了None
。
父级获得哨兵后,它将在子级上运行terminate()
以终止它。
如果父母需要在等待结果的同时做一些事情,则需要定期检查队列中是否有东西:
# do stuff in parent
if not result.empty():
event = result.get()
# process event as above and terminate if `None`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.