Мультипроцесс не будет работать параллельно в Windows на ноутбуке Jupyter - PullRequest
0 голосов
/ 02 февраля 2019

В настоящее время я работаю над Windows на ноутбуке Jupyter и изо всех сил пытаюсь заставить работать многопроцессорную систему.Он не запускает все мои асинхронные параллельно, он запускает их поочередно по одному, пожалуйста, предоставьте некоторые указания, где я иду не так.Мне нужно поместить результаты в переменную для будущего использования.Что я не понимаю?

import multiprocessing as mp
import cylib
Pool = mp.Pool(processes=4)
result1 = Pool.apply_async(cylib.f, [v]) # evaluate asynchronously 
result2 = Pool.apply_async(cylib.f, [x]) # evaluate asynchronously
result3 = Pool.apply_async(cylib.f, [y]) # evaluate asynchronously 
result4 = Pool.apply_async(cylib.f, [z]) # evaluate asynchronously

vr = result1.get(timeout=420) 
xr = result2.get(timeout=420)
yr = result3.get(timeout=420) 
zr = result4.get(timeout=420)

1 Ответ

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

Задачи выполняются параллельно.

Однако при этом результаты извлекаются синхронно, т. Е. «Подождите, пока результат1 будет готов, затем подождите, пока результат2 будет готов, ..» и т. Д.

vr = result1.get(timeout=420) 
xr = result2.get(timeout=420)
yr = result3.get(timeout=420) 
zr = result4.get(timeout=420)

Рассмотрим следующий пример кодагде каждая задача опрашивается асинхронно

from time import sleep
import multiprocessing as mp
pool = mp.Pool(processes=4)

# Create tasks with longer wait first
tasks = {i: pool.apply_async(sleep, [t]) for i, t in enumerate(reversed(range(3)))}
done = set()


# Keep polling until all tasks complete
while len(done) < len(tasks):

    for i, t in tasks.items():

        # Skip completed tasks
        if i in done:
            continue

        result = None

        try:
            result = t.get(timeout=0)
        except mp.TimeoutError:
            pass
        else:
            print("Task #:{} complete".format(i))
            done.add(i)

. Вы можете повторить что-то подобное, как описано выше, или использовать аргумент обратного вызова на apply_async, чтобы выполнить некоторую обработку автоматически по завершении задачи.

...