Самый быстрый способ восстановить возвращаемое значение функции, переданной в мультипроцессинг. Процесс - PullRequest
0 голосов
/ 24 октября 2018

У меня тяжелая пакетная работа, поэтому я нарезал ее на 30 (количество моих процессоров) мини-пакетов и сделал 30 multiprocessing.Process для их выполнения (по какой-то причине я не использовал multiprocessing.Pool).Для возвращаемого значения я использовал 30 multiprocessing.Queue.Это обзор моего кода:

    def minibatch(q, data, i):
        do_some_work_data_i
        q.put(return_value)

    if __name__ == '__main__':
        q1 = Queue()
        p1 = Process(target=minibatch, args=(q1, data[1], 1))
        p1.start()

        q2 = Queue()
        p2 = Process(target=minibatch, args=(q2, data[2], 2))
        p2.start()

        first_return_value = q1.get()
        second_return_value = q2.get()

        p1.join()
        p2.join()

Теперь я обнаружил, что он слишком медленный!если каждая мини-партия занимает 10 секунд, я ожидаю, что мой код запускается около 10 секунд, но это занимает гораздо больше времени.Так что мне делать вместо этого?

1 Ответ

0 голосов
/ 25 октября 2018

Последовательность выполнения

processing time * number of runs

Параллель времени выполнения

(processing time) * (number of runs / number of parallel processes) 
+ (process start overhead * number parallel processes) 

Если ваше время обработки не слишком велико, то издержки на создание новых процессов перевешивают экономию, которую вы получаетеиз параллелизма.

Если ваша последовательная партия занимает ~ 300 секунд, тогда ваша параллельная реализация, вероятно, займет всего <11 секунд, но если ваша последовательная партия займет всего 10 секунд, то запуск ее на 30 процессах может фактически занять больше времени. </p>

...