Python 多处理队列死锁
以下代码阻塞,不允许程序退出:Python 多处理队列死锁,python,Python,以下代码阻塞,不允许程序退出: 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") 我已经在docker for Mac中多次使用Python 3.6和3.7,使用docke
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")
我已经在docker for Mac中多次使用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\u nowait
)没有帮助queue.Empty
- 在队列中放入更少或更小的项目可以让程序退出
- 添加
也可以让程序退出q.close()
- 与
相同,它允许对队列进行垃圾收集(从而q=None
d).close
- 我做错什么了吗
- 多处理队列中元素的总大小是否有隐式限制
被记录为“大多数代码通常不需要”;在什么情况下是必要的?这对我来说似乎很有必要。为什么?多处理.Queue.close
- 这只是多处理队列中的一个bug吗
我没有收到这样的错误。我没有收到这样的错误如果我没有收到这样的错误,我就无能为力了。
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")
for i in range(100000):
print(q.get())