以下代码阻止并且不允许程序退出:
import multiprocessing
q = multiprocessing.Queue()
for i in range(10000):
q.put("x" * 1000)
# Un-commenting the next line lets the program exit
# q.close()
print("trying to exit")
在Mac的Docker中,我已经使用Python 3.6和3.7使用官方的docker镜像运行了很多次,每次都要中断它(Ctrl+C
)。
堆栈跟踪表明在队列完成期间出现死锁:
^CError in atexit._
run_exitfuncs:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/multiprocessing/util.py", line 265, in _run_finalizers
finalizer()
File "/usr/local/lib/python3.7/multiprocessing/util.py", line 189, in __call__
res = self._callback(*self._args, **self._kwargs)
File "/usr/local/lib/python3.7/multiprocessing/queues.py", line 192, in _finalize_join
thread.join()
File "/usr/local/lib/python3.7/threading.py", line 1044, in join
self._wait_for_tstate_lock()
File "/usr/local/lib/python3.7/threading.py", line 1060, in _wait_for_tstate_lock
elif lock.acquire(block, timeout):
KeyboardInterrupt
备注:
q.get_nowait
直到queue.Empty
)无济于事q.close()
也会使程序退出q = None
相同,它可以使队列被垃圾收集(因此.close
d)问题:
multiprocessing.Queue
中元素的总大小是否隐含限制?multiprocessing.Queue.close
被记录为“通常对于大多数代码而言都是不必要的”;在什么情况下有必要?就我而言,这似乎非常必要。为什么?multiprocessing.Queue
中的错误吗?