This is because when you put
lots of items into a multiprocessing.Queue
, they eventually get buffered in memory, once the underlying Pipe
is full. The buffer won't get flushed until something starts reading from the other end of the Queue
, which will allow the Pipe
to accept more data. A Process
cannot terminate until the buffer for all its Queue
instances have been entirely flushed to their underlying Pipe
. The implication of this is that if you try to join
a process without having another process/thread calling get
on its Queue
, you could deadlock. This is mentioned in the docs:
Warning
As mentioned above, if a child process has put items on a queue (and
it has not used JoinableQueue.cancel_join_thread
), then that process
will not terminate until all buffered items have been flushed to the
pipe.
This means that if you try joining that process you may get a deadlock
unless you are sure that all items which have been put on the queue
have been consumed. Similarly, if the child process is non-daemonic
then the parent process may hang on exit when it tries to join all its
non-daemonic children.
Note that a queue created using a manager does not have this issue.
You can fix the issue by not calling join
until after you empty the Queue
in the parent:
for _ in xrange(len(langs)):
item = que.get()
print(item)
dicList.append(item)
# join after emptying the queue.
for p in processList:
p.join()
print("here")
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…