Python 线程事件在 python 3.11.5 中未按预期工作(在 python 3.9.6 中有效)

Python Thread events not working as expected in python 3.11.5 (works in python 3.9.6)

提问人:ant r 提问时间:10/30/2023 更新时间:10/30/2023 访问量:27

问:

我有一个多线程客户端,其启动如下所示:

pauseEvent = threading.Event()

input = InputThread(clientSocket, username, pauseEvent)
response = ReponseThread(clientSocket, username, pauseEvent)

input.start()
response.start()

传入线程。Event() 添加到线程中,然后使用它,如下所示:

输入线程

while True:
    message = input("blah blah")
    socket.send(message.encode())
    print("paused")
    self.pauseEvent.wait()

响应线程

while True:
    data = self.clientSocket.recv(2048)
    response: str = data.decode()
    print("\n" + response[22:])
    sys.stdout.flush()
    self.pauseEvent.set()
            

因此,除非我遗漏了 inputThread 应该在 ResponseThread 等待 recv 时等待输入的内容,否则在 stdin 中给出输入后,输入线程发送消息,然后等到响应线程接收并打印响应,然后可以“解锁”事件。之后,输入线程将重新提示。

预期流量:

  • 等等等等
  • { 用户输入 }
  • 服务器响应

重复

电流:

  • 等等等等
  • { 用户输入 }
  • 等等等等
  • 服务器响应
  • { 用户输入 }

我尝试转储粗壮的缓冲区,如sys.stdout.flush()所示,但这什么也没做。我还尝试使用 python 3.9.6(因为这是我下载的唯一其他 python 解释器),出于某种奇怪的原因,这使它按预期工作。不确定自该版本以来线程事件是否发生了重大变化。

python-3.x 多线程 python-3.11

评论

0赞 Solomon Slow 10/31/2023
IDK 发生了什么变化,但看起来好像您希望两个线程彼此完美同步运行。从来没有任何时刻,其中一个人不直接或间接地等待另一个人。有时它们都在等待输入,但它们正在等待输入,当输入到达时,操作系统将对其进行缓冲。那么使用两个线程有什么意义呢?为什么不让单个线程 (1) 提示用户输入,(2) 将用户输入发送到远程服务,(3) 等待服务的回复,以及 (4) 在返回步骤 (1) 之前打印回复?
0赞 ant r 10/31/2023
是的,这在这种情况下会起作用,但它实际上是一个比这复杂得多的文件,我只是将其简化为基本问题,两个线程文件都太大了,并且不认为在这里发布整个内容根本没有好处。

答: 暂无答案