Я хочу сделать параллельную карту над большим списком. Код выглядит примерно так:
big_list
|> Stream.map(&Task.async(Module, :do_something, [&1]))
|> Stream.map(&Task.await(&1))
|> Enum.filter filter_fun
Но я проверял реализацию Stream, и насколько я понимаю, Stream.map
объединяет функции и применяет комбинированную функцию к элементам в потоке, что означает, что последовательность выглядит так:
- Возьмите первый элемент
- Создать задачу async
- Подождите, пока он закончит.
- Возьмите второй элемент...
В этом случае он не делает это параллельно. Я прав, или я чего-то не хватает?
Если я прав, как насчет этого кода?
Stream.map Task.async ...
|> Enum.map Task.await ...
Это будет работать параллельно?