多处理队列死锁

时间:2019-08-17 13:52:23

标签: 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")

在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中的错误吗?

1 个答案:

答案 0 :(得分:0)

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())

即使这是可行的,但是如果您通过q.close()关闭q,则多处理将如何将项目置于闭合的q中。

enter image description here

我没有收到这样的错误。