многопроцессорная очередь python завершена

#python #process #queue #multiprocess

#python #процесс #очередь #многопроцессорный

Вопрос:

Я создаю простую программу на Python, и ниже приведен исходный код.

 # -*- coding: utf-8 -*-
  import sys
  from multiprocessing import Process, Queue

  def worker(q):
      test = q.get()
      print str(test)   ' success!'

  if __name__ == "__main__":
         test = ['a','e','f','d',1,2]
         print test

         q = Queue()
         q.put(test)

         p0 = Process(target=worker, args=(q,))
         p0.start()
         p0.join()

         print 'python exit!!'
  

и вот результат успеха.

 ['a', 'e', 'f', 'd', 1, 2]
['a', 'e', 'f', 'd', 1, 2] success!
python exit!!
  

но когда я запускаю эту программу, как показано ниже, она просто запускается с двумя процессами.

 # -*- coding: utf-8 -*-
  import sys
  from multiprocessing import Process, Queue

  def worker(q):
      test = q.get()
      print str(test)   ' success!'

  if __name__ == "__main__":
         test = ['a','e','f','d',1,2]
         print test

         q = Queue()
         q.put(test)

         p0 = Process(target=worker, args=(q,))
         p1 = Process(target=worker, args=(q,))
         p0.start()
         p1.start()
         p0.join()
         p1.join()

         print 'python exit!!'
  

его вывод такой.

 ['a', 'e', 'f', 'd', 1, 2]
['a', 'e', 'f', 'd', 1, 2] success!
  

программа не завершается! в чем проблема. Есть ли какие-либо проблемы с очередью? когда я запускаю с помощью

p0 = Процесс (цель = рабочий, аргументы =(тест,))

вместо q проблем нет.

Ответ №1:

https://docs.python.org/2/library/multiprocessing.html#multiprocessing .Queue.get:

get([block[, timeout]])

Удалите и верните элемент из очереди. Если необязательный блок аргументов имеет значение True (по умолчанию), а время ожидания равно None (по умолчанию), при необходимости заблокируйте, пока элемент не будет доступен. Если тайм-аут является положительным числом, он блокируется не более чем на секунды ожидания и вызывает очередь.Пустое исключение, если ни один элемент не был доступен в течение этого времени. В противном случае (блок равен False) верните элемент, если он доступен немедленно, иначе поднимите очередь.Пустое исключение (в этом случае тайм-аут игнорируется).

Итак, при вызове p0.start() он удалит все элементы в очереди. После вызова p1.start() метод q.get() должен ждать, пока не будет доступен элемент очереди.