Вы правы, что они не будут в точности равны, но в основном это потому, что ваш тестовый образец настолько мал.Для начала и начала обработки каждого процесса требуется время.Время, необходимое для обработки элемента в очереди, чрезвычайно мало, и поэтому можно быстро обработать 9 элементов, прежде чем другой пройдет через него.
Я проверил это ниже (в Python3, но он должен применяться для 2.7 какну просто измените функцию print()
на оператор print
):
import os
import multiprocessing
# Worker function
def worker(queueA, queueB):
for item in iter(queueA.get, 'STOP'):
out = str(os.getpid())
queueB.put(out)
return
# IPC Manager
manager = multiprocessing.Manager()
queueA = multiprocessing.Queue()
queueB = multiprocessing.Queue()
# Fill queueA with data
for i in range(0, 1000):
queueA.put("hello" + str(i+1))
# Create processes
process1 = multiprocessing.Process(target = worker, args = (queueA, queueB,))
process2 = multiprocessing.Process(target = worker, args = (queueA, queueB,))
# Call processes
process1.start()
process2.start()
queueA.put('STOP')
queueA.put('STOP')
# Wait for processes to stop processing
process1.join()
process2.join()
all = {}
for i in range(1000):
item = queueB.get()
if item not in all:
all[item] = 1
else:
all[item] += 1
print(all)
Мой вывод (подсчет того, сколько было сделано из каждого процесса):
{'18376': 537,
'18377': 463}
Покаони не являются точно такими же, так как мы приближаемся к более длинным временам, они приблизятся к тому, чтобы быть примерно равными.
Редактировать:
Другой способ подтвердить это - добавить time.sleep(3)
внутрирабочая функция
def worker(queueA, queueB):
for item in iter(queueA.get, 'STOP'):
time.sleep(3)
out = str(os.getpid())
queueB.put(out)
return
Я выполнил тест range(10)
, как в исходном примере, и получил:
{'18428': 5,
'18429': 5}