Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多处理队列死锁_Python - Fatal编程技术网

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
    相同,它允许对队列进行垃圾收集(从而
    .close
    d)
问题:

  • 我做错什么了吗
  • 多处理队列中元素的总大小是否有隐式限制
  • 多处理.Queue.close
    被记录为“大多数代码通常不需要”;在什么情况下是必要的?这对我来说似乎很有必要。为什么?
  • 这只是多处理队列中的一个bug吗
即使这样也可以,但是如果您通过q.close()关闭q,那么多处理将如何将项放入关闭的q中


我没有收到这样的错误。

我没有收到这样的错误如果我没有收到这样的错误,我就无能为力了。
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())