Я пытаюсь создать кучу multiprocessing.Process()
объектов как рабочих. Первому исполнителю требуется 0,02 секунды для создания и вызова .start()
, но все последующие занимают> 1 секунды. Эти накладные расходы кажутся большими и неправильными и убивают мою производительность. Вот очень простой пример кода:
import time
import queue
from multiprocessing import Process, Queue
def worker_fun(queue_in, queue_out):
while True:
try:
# grab a task
task = queue_in.get_nowait()
if task == 'STOP':
break # kill signal
queue_out.put('done with %s' % task)
except queue.Empty:
pass
def run():
nproc = 10
processes = []
queue_in = Queue()
queue_out = Queue()
args = (queue_in, queue_out)
# create the processes & start them
for i in range(nproc):
t0 = time.time()
p = Process(target=worker_fun, args=args)
p.start()
t1 = time.time() - t0
print("Starting process %i took %f sec" % (i, t1))
processes.append(p)
t0 = time.time()
ntask = 1000
for i in range(ntask):
queue_in.put(i)
results = []
for _ in range(ntask):
res = queue_out.get()
results.append(res)
t1 = time.time() - t0
print("Getting all results took %f sec" % t1)
# send the stop signal & clean up
for _ in range(nproc):
queue_in.put('STOP')
for p in processes:
p.join()
if __name__ == "__main__":
run()
Я на Windows 10, Python 3.8, PyCharm 2020.1.3. Вот типичный результат:
Starting process 0 took 0.024902 sec
Starting process 1 took 1.282572 sec
Starting process 2 took 1.277583 sec
Starting process 3 took 1.315482 sec
Starting process 4 took 1.449126 sec
Starting process 5 took 1.621662 sec
Starting process 6 took 1.777248 sec
Starting process 7 took 1.897925 sec
Starting process 8 took 2.126314 sec
Starting process 9 took 2.226047 sec
Getting all results took 0.153589 sec
Я неправильно использую многопроцессорность? Почему запуск каждого последующего процесса занимает так много времени? Как я могу сделать этот код быстрее?
Я пробовал удалить queue_out, это не помогает. Сначала я подумал, что всем рабочим копируется какая-то огромная переменная, но я не могу представить, что это будет в этом минимальном примере. Кроме того, я не могу использовать multiprocessing.Pool()
из-за некоторых других более сложных вещей, происходящих в моей реальной рабочей функции.
UPDATE
Проблема заключалась в том, что я работал в режиме отладки в PyCharm. Нормальный режим работы работает должным образом: ~ 0,007 сек c для запуска каждого процесса, так же, как и при работе в обычном терминале.