Python2.7:多处理:在使用队列进行通信时如何不阻塞

2024-10-05 14:22:09 发布

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

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

我可以通过使用get\u 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()

Tags: fromimportselfeventget队列queue进程
1条回答
网友
1楼 · 发布于 2024-10-05 14:22:09

你可以用哨兵。在

将sentinel定义为一个从未出现在正常数据中的值,当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()

相关问题 更多 >