Взаимоблокировки при использовании очередей и многопроцессорной обработки

Я не понимаю эту часть документа по многопроцессорности (python.org ) и цитирую:

«Пример, который приведет к тупику, следующий:

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

«Во-первых, почему он блокируется? И, что более удивительно, он отлично работает, когда я пробую с некоторыми меньшими значениями, чем 1000000 в определении f (он работает с 10,100,1000,10000, но не с 100000).

Большое спасибо за твою помощь !




Ответы (1)


Этот пример иллюстрирует поведение, описанное в 17.2.2.2.

если дочерний процесс поместил элементы в очередь (и не использовал JoinableQueue.cancel_join_thread), то этот процесс не завершится до тех пор, пока все буферизованные элементы не будут сброшены в конвейер. Это означает, что если вы попытаетесь присоединиться к этому процессу, вы можете получить взаимоблокировку, если не уверены, что все элементы, помещенные в очередь, были использованы.

person Pete Kirkham    schedule 19.07.2015
comment
Спасибо, я понял как ваше объяснение, так и дублирующийся пост. Чего я не понимаю, так это почему существует буфер, который сбрасывается, и что устанавливает объем данных, после которого данные буферизуются. Но теперь я могу спокойно программировать :) - person Labo; 20.07.2015