Снижение накладных расходов при использовании множественной многопроцессорной обработки. Процесс в PyCharm - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь создать кучу 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 для запуска каждого процесса, так же, как и при работе в обычном терминале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...