【发布时间】:2023-03-13 19:09:01
【问题描述】:
我很难理解为什么这个简单的程序最后会引发EOFError。
我正在使用Queue() 与Thread() 通信,我想自动干净地终止我的程序的atexit。
import threading
import multiprocessing
import atexit
class MyClass:
def __init__(self):
self.queue = None
self.thread = None
def start(self):
self.queue = multiprocessing.Queue()
self.thread = threading.Thread(target=self.queued_writer, daemon=True)
self.thread.start()
# Remove this: no error
self.queue.put("message")
def queued_writer(self):
while 1:
msg = self.queue.get()
print("Message:", msg)
if msg is None:
break
def stop(self):
self.queue.put(None)
self.thread.join()
instance = MyClass()
atexit.register(instance.stop)
# Put this before register: no error
instance.start()
这引发了:
Traceback (most recent call last):
File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
self.run()
File "/usr/lib/python3.6/threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "test.py", line 21, in queued_writer
msg = self.queue.get()
File "/usr/lib/python3.6/multiprocessing/queues.py", line 94, in get
res = self._recv_bytes()
File "/usr/lib/python3.6/multiprocessing/connection.py", line 216, in recv_bytes
buf = self._recv_bytes(maxlength)
File "/usr/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
buf = self._recv(4)
File "/usr/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
raise EOFError
EOFError
此外,这个 sn-p 的行为很奇怪:如果我删除 self.queue.put("message") 行,则不会引发错误并且线程成功退出。同样,如果在 atexit.register() 之前调用 instance.start(),这似乎也有效。
请问有谁知道这个错误是从哪里来的?
编辑:我注意到使用SimpleQueue() 似乎会使错误消失。
【问题讨论】:
标签: python multithreading python-3.x queue multiprocessing