#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()
должен ждать, пока не будет доступен элемент очереди.