python多处理子进程触发父事件或方法

2024-05-19 10:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用多处理来创建一个子进程,然后子进程将执行一些耗时长的工作,这些工作可能永远不会结束。在

我想做的是,当子进程完成一个步骤时,它将触发父进程的事件或只是调用一些函数。在

以下是我剧本的一部分:

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

提前谢谢。在


Tags: selfqueue进程initdefexitresultmultiprocessing
1条回答
网友
1楼 · 发布于 2024-05-19 10:28:32

不能直接调用另一个进程中的方法,但有两种可能:

a) 父级等待子级发送

您需要设置一个^{},以便从子节点到父节点通信(如果需要双向通信,则设置^{}),然后创建父块(运行get()),直到子节点发送数据(运行put())。在

因为您已经在代码中设置了一个队列result,所以您要么要接受这个队列,要么将另一个队列交给WorkerProcess__init__构造函数。在

在父进程中执行以下操作:

        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()

您需要定义孩子如何在发送最后一个元素(也称为“sentinel”)时进行通信,我在上面的示例代码中选择了None。在

一旦父进程获得了sentinel,它就在子进程上运行terminate()来结束它。在

b) 家长对更改的轮询

如果家长需要在等待结果的同时做一些事情,您需要定期检查队列中是否有内容:

^{pr2}$

相关问题 更多 >

    热门问题