我使用多处理来创建一个子进程,然后子进程将执行一些耗时长的工作,这些工作可能永远不会结束。在
我想做的是,当子进程完成一个步骤时,它将触发父进程的事件或只是调用一些函数。在
以下是我剧本的一部分:
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
提前谢谢。在
不能直接调用另一个进程中的方法,但有两种可能:
a) 父级等待子级发送
您需要设置一个^{} ,以便从子节点到父节点通信(如果需要双向通信,则设置^{} ),然后创建父块(运行
get()
),直到子节点发送数据(运行put()
)。在因为您已经在代码中设置了一个队列
result
,所以您要么要接受这个队列,要么将另一个队列交给WorkerProcess
的__init__
构造函数。在在父进程中执行以下操作:
您需要定义孩子如何在发送最后一个元素(也称为“sentinel”)时进行通信,我在上面的示例代码中选择了
None
。在一旦父进程获得了sentinel,它就在子进程上运行
terminate()
来结束它。在b) 家长对更改的轮询
如果家长需要在等待结果的同时做一些事情,您需要定期检查队列中是否有内容:
^{pr2}$相关问题 更多 >
编程相关推荐