Python 2.7:多处理:如何在使用队列进行通信时不阻塞

Python 2.7: Multiprocessing: How to not block whilst using a queue for communication

我正在使用队列在进程之间进行通信,还使用事件标志来指示父进程是否要退出,但是子进程中的队列处于阻塞状态,等待更多输入。

我可以使用 get_nowait() 使队列不阻塞,但是这会使处理器使用 100%

能够关闭子进程并同时接受输入的推荐方法是什么?

from multiprocessing import Process
from multiprocessing import Event
from multiprocessing import Queue

class EchoProcess(Process):

    def __init__(self, iQ, closeEvent):
        Process.__init__(self)
        self.iQ = iQ
        self.closeEvent = closeEvent

    def run(self):
        while not self.closeEvent.is_set():
            istring = self.iQ.get()
            print(istring)
        print("exited")

if __name__ == "__main__":
    iQ = Queue()
    closeEvent = Event()
    echoProcess = EchoProcess(iQ, closeEvent)
    echoProcess.start()
    while True:
        istring = raw_input("Enter:")
        if istring == "quit": break
        iQ.put(istring)
    closeEvent.set()

你可以使用哨兵。

将哨兵定义为从不出现在正常数据中的值,当 EchoProcess 获取它时,它会退出。

例如:

from multiprocessing import Process
from multiprocessing import Queue

class Sentinel(object): pass

class EchoProcess(Process):

    def __init__(self, iQ):
        Process.__init__(self)
        self.iQ = iQ

    def run(self):
        for istring in iter(iQ.get, Sentinel):
            print(istring)
        print("exited")

if __name__ == "__main__":
    iQ = Queue()
    echoProcess = EchoProcess(iQ)
    echoProcess.start()
    while True:
        istring = raw_input("Enter:")
        if istring == "quit": break
        iQ.put(istring)
    iQ.put(Sentinel)
    echoProcess.join()