Как выполнить задачу параллельно и получить результат?
Имеется проект на python3.
Есть функция, выполняющая долгие вычисления. В конце она возвращает число.
Эти числа, после нескольких проходов вычислений, нужно сложить.
Как запустить выполнение функции в несколько потоков, дождаться их завершения и получить значения из потока?
Какую библиотеку использовать, thread, multiprocessing?
Узкое место процессор? Если да, то multiprocessing. Если IO, то можно и thread, но лучше gevent.
Что-то вроде
import multiprocessing as mp
def slow_calc(data):
...
return result
pool = mp.Pool(processes=mp.cpu_count())
for res in pool.map(slow_calc, data_chunks):
...
Сергей Горностаев:
1. я удаляю свои ответы в таких случаях
2. можно оставить ту часть, которая "содержательнее"
3. мне кажется неправильным такой подход.
А печаль в том, что люди совершенно не хоят смотреть документацию. 90 процентов вопросов появляются из-за нежелания потратить несколько минут на чтение и усвоение информации.
Владимир Сидоров: так это чисто академический пример, реально весь код будет выполняться на одном ядре и параллельности там никакой не будет, кооперативная многозадачность. асинхронность имеет смысл при io операциях. по вашей ссылке так и написано:
This module provides infrastructure for writing single-threaded concurrent code using coroutines...
angru: мне кажется, если надо просто быстро решить эту задачу то и asyncio вполне подойдёт, или есть всё-таки желание переписать всё под multiprocessing?
Владимир Сидоров: если я правильно понял задачу автора, то ее проще решить обычным циклом, чем используя asyncio и, скорее всего, даже эффективнее, т.к. нет затрат на переключение контекста. А под multiprocessing, вон во втором ответе есть пример, три строчки кода, не считая функции с вычислениями.
angru: только я сомневаюсь, что это будет нормально работать, посмотрите хотя бы сюда: Почему Python multiprocessing нестабилен? Даже у Саммерфилда в книжке читал что лучше не связываться без особой нужны с этим делом :)
Владимир Сидоров: это все можно протестировать(всего три строчки кода), и если уж совсем не работает, то просто на циклах сделать. асинхронность тут абсолютно не к месту.