Я делаю некоторые вычисления в больших наборах байтов. Процесс выполняется на кусках байтов. Я пытаюсь использовать параллельную обработку с использованием многопроцессорности для повышения производительности. Первоначально я пытался использовать pool.map, но это допускает только один аргумент, затем я нашел о pool.starmap. Но pool.starmap дает результаты только после завершения всех процессов. Мне нужны результаты, когда они приходят (вроде). Я пытаюсь использовать pool.imap, который предоставляет результаты по завершении процессов, но не допускает множественные аргументы (моя функция требует 2 аргумента). Кроме того, важна последовательность результатов.Имеет ли multiprocessing.pool.imap вариант (например, starmap), который допускает несколько аргументов?
Некоторые примеры кода ниже:
pool = mp.Pool(processes=4)
y = []
for x in pool.starmap(f, zip(da, repeat(db))):
y.append(x)
Приведенный выше код работает, но только дает результаты, как только завершили все процессы. Я не вижу никакого прогресса. Вот почему я пытался использовать pool.imap, хорошо работает, но только с одним аргументом:
pool = mp.Pool(processes=4)
y = []
for x in pool.imap(f, da)):
y.append(x)
На нескольких аргументов вызывает следующее исключение:
TypeError: f() missing 1 required positional argument: 'd'
Ищете простой способ достижения всех 3 требований :
- параллельной обработки с использованием нескольких параметров/аргументы
- удается увидеть прогресс в то время как процессы выполняются
- Приказанные результаты.
Спасибо!
Хотя я перейду по вашей ссылке, я просто хотел бы упомянуть, что с помощью pool.starmap я получаю элементы 1 и 3, но не 2 и используя pool.imap. Я получаю все 3, за исключением нескольких частей аргумента. Мой второй аргумент представляет собой 3-й список (который остается постоянным для всех процессов). вы бы порекомендовали объединить их в комбинацию. Благодаря! –
решение по ссылке работает, и теперь я могу достичь всех 3. Большое спасибо за это. Я хотел увидеть обновление с помощью progressbar. я пытался заставить его работать, но запуск основного уровня в главном и обновление в add_print, похоже, не сработает. Я даже попытался отметить progressbar как глобальный или передал его как параметр. но не повезло. любые мысли, пожалуйста. –