У меня вопрос о понимании очереди в модуле multiprocessing
в python 3
Это то, что они говорят в правилах программирования:
Имейте в виду, что процесс, который поместил элементы в очередь, будет ждать раньше до тех пор, пока все буферизованные элементы не будут подаваться нитью фидера базовая труба. (Детский процесс может вызвать Queue.cancel_join_thread метод очереди, чтобы избежать такого поведения.)
Это означает, что всякий раз, когда вы используете очередь, вам нужно убедиться, что все элементы, которые были помещены в очередь, в конечном итоге будут удалены до процесс соединен. В противном случае вы не можете быть уверены, что процессы, которые положить предметы в очередь завершатся. Помните также, что не-демонические процессы будут автоматически соединены.
Примером может быть тупик:
from multiprocessing import Process, Queue def f(q): q.put('X' * 1000000) if __name__ == '__main__': queue = Queue() p = Process(target=f, args=(queue,)) p.start() p.join() # this deadlocks obj = queue.get()Исправить здесь будет замена последних двух строк (или просто удаление p.join()).
Поэтому, по-видимому, queue.get()
не следует вызывать после join()
.
Однако есть примеры использования очередей, где get
вызывается после join
, как:
import multiprocessing as mp
import random
import string
# define a example function
def rand_string(length, output):
""" Generates a random string of numbers, lower- and uppercase chars. """
rand_str = ''.join(random.choice(
string.ascii_lowercase
+ string.ascii_uppercase
+ string.digits)
for i in range(length))
output.put(rand_str)
if __name__ == "__main__":
# Define an output queue
output = mp.Queue()
# Setup a list of processes that we want to run
processes = [mp.Process(target=rand_string, args=(5, output))
for x in range(2)]
# Run processes
for p in processes:
p.start()
# Exit the completed processes
for p in processes:
p.join()
# Get process results from the output queue
results = [output.get() for p in processes]
print(results)
Я запустил эту программу, и она работает (также опубликовано как решение вопроса StackOverFlow Python 3 - Multiprocessing - Queue.get() не отвечает).
Может кто-нибудь помочь мне понять, что такое правило для тупика здесь?