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

时间:2017-02-13 15:00:57

标签: python events multiprocessing

我正在使用多处理来创建子进程,然后子进程将花费一些时间来完成可能永远不会结束的长时间工作。

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

以下是我的脚本的一部分:

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

a)父母等到孩子发送

你需要设置一个queue来从孩子到父母(或者pipe进行沟通,如果你需要两种方式进行交流),然后制作父块(运行{{} 1}})直到孩子发送数据(运行get())。

由于您已经在代码中设置了一个队列put(),您可能想要将其带到另一个队列,或者将result构造函数移交给__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以结束它。

b)家长民意调查的变化

如果父母需要在等待结果的同时做些事情,你需要定期检查队列中是否有东西:

terminate()