Python线程,事件和队列如何协同工作?

Python线程,事件和队列如何协同工作?,python,multithreading,concurrency,queue,python-multithreading,Python,Multithreading,Concurrency,Queue,Python Multithreading,在看了比斯利书中的例子后,我和我的朋友聊天 class ActorExit(Exception): pass class Actor: def __init__(self): self._mailbox = Queue() def send(self, msg): self._mailbox.put(msg) def recv(self): msg = self._mailbox.get() i

在看了比斯利书中的例子后,我和我的朋友聊天

class ActorExit(Exception):
    pass

class Actor:
    def __init__(self):
        self._mailbox = Queue()

    def send(self, msg):
        self._mailbox.put(msg)

    def recv(self):
        msg = self._mailbox.get()
        if msg is ActorExit:
            raise ActorExit()
        return msg

    def close(self):
        self.send(ActorExit)

    def start(self):
        self._terminated = Event()
        t = Thread(target=self._bootstrap)
        t.daemon = True
        t.start()

    def _bootstrap(self):
        try:
            self.run()
        except ActorExit:
            pass
        finally:
            self._terminated.set()

    def join(self):
        self._terminated.wait()

    def run(self):
        while True:
            msg = self.recv()

class PrintActor(Actor):
    def run(self):
        while True:
            msg = self.recv()
            print('Got:', msg)
我的朋友认为事件的唯一目的是阻塞主线程,直到另一个线程执行set操作。 这是真的吗? 我们如何观看线程执行

Python线程,事件和队列如何协同工作

他们没有。您可以使用没有队列的事件和没有事件的队列,它们之间没有依赖关系。您的示例恰好同时使用了这两种方法

我的朋友认为事件的唯一目的是阻塞主线程,直到另一个线程执行set操作。这是真的吗

在事件对象上调用
.wait()
将阻止任何调用线程,直到内部标志为
.set()

如果查看事件的源代码,您会发现事件只是由一个带锁的条件变量和一个布尔标志+方法组成,用于处理和通信(等待线程)该标志的状态更改

class Event:

    """Class implementing event objects.
    Events manage a flag that can be set to true with the set() method and reset
    to false with the clear() method. The wait() method blocks until the flag is
    true.  The flag is initially false.
    """

    def __init__(self):
        self._cond = Condition(Lock())
        self._flag = False
    ...
我们如何观看线程执行

一个简单的方法是应用某种实用函数,打印出您感兴趣的内容,例如:

def print_info(info=""):
    """Print calling function's name and thread with optional info-text."""
    calling_func = sys._getframe(1).f_code.co_name
    thread_name = threading.current_thread().getName()
    print(f"<{thread_name}, {calling_func}> {info}", flush=True)
输出:

<MainThread, send> sent: Hello
<Thread-1, run> got: Hello
<MainThread, send> sent: ...World!
<Thread-1, run> got: ...World!
<MainThread, close> 
<MainThread, send> sent: STOP
sent:你好
格特:你好
发送:……世界!
得到:……世界!
发送:停止
<MainThread, send> sent: Hello
<Thread-1, run> got: Hello
<MainThread, send> sent: ...World!
<Thread-1, run> got: ...World!
<MainThread, close> 
<MainThread, send> sent: STOP