Вывод рабочих из очереди медленнее с несколькими процессами, чем с одним процессом - PullRequest
0 голосов
/ 05 февраля 2019

Итак, у меня есть следующий код

import time
from multiprocessing import Process
from multiprocessing import JoinableQueue as Queue

def checker(q):
    while True:
        data = q.get()
        if data is None:
            return

if __name__ == '__main__':
    t = time.time()
    q = Queue()

    for i in range(500000):
        q.put(i)
    procs = []
    for _ in range(4):
        q.put(None)
        p = Process(target=checker, args=(q,), daemon=True)
        # p = Thread(target=checker, args=(q,))
        p.start()
        procs.append(p)

    for p in procs:
        p.join()

    print(time.time() - t)

Когда я запускаю эту программу с 4 параллельными процессами, она занимает около 4.14 секунд, а когда она запускается только с одним процессомзанимает около 3.7 секунд.

То же самое происходит с несколькими потоками, работающими одновременно.

Мое возможное объяснение этого поведения состоит в том, что, поскольку queues являются multithreading и multiprocessing безопаснымии имеют встроенную реализацию мьютекса, только один thread или process может получить доступ к очереди за один раз.

Таким образом, при использовании одного процесса / потока интерпретатор или процессор python не может сделать упреждения, чтобы гарантировать, что каждый поток / процесс получает равные возможности для запуска своего кода, но несколько процессов / потоковСтоимость этого вытеснения увеличивает общее время выполнения программы.

Поэтому я думаю о правильных строках или это происходит из-за чего-то другого.

1 Ответ

0 голосов
/ 05 февраля 2019

Это не удивительно.Вы ничего не делаете.Итак, что вы измеряете, так это издержки порождения нескольких процессов, настройки межпроцессного взаимодействия, а также маршалинга и демаршалирования данных по этим каналам.Это дорого.

Но попробуйте выполнить некоторые реальные вычисления в программе проверки, и таблица быстро перевернется.

...