2017-02-19 57 views
2

Я хочу выполнять несколько задач одновременно. В JavaScript, я хотел бы сделать:Как подождать несколько задач в Elixir?

async function cook_an_egg() {} 

async function take_shower() {} 

async function call_mum() {} 

await Promise.all([cook_an_egg(), take_shower(), call_mum()]) 

Как достичь Promise.all в модуле Elixir задач? От documentation, кажется, вы можете только await 1 задача; определять 1 функцию внутри каждого task; и применять только одну и ту же функцию к нескольким элементам с помощью async_stream.

+0

Используйте Elixir эквивалент http://stackoverflow.com/a/20573151/49197 –

+1

Там также 'Task.yield_many/2'. – Dogbert

ответ

7

Вы можете отобразить функцию await в список заданий. Что-то вроде

tasks = Enum.reduce(0..9, [], fn _, acc -> 
    [Task.async(&any_job/0) | acc] 
end) 

Enum.map(tasks, &Task.await/1) 
+0

Интересно, я бы ожидал, что первая функция «Task.await» внутри функции карты заблокирует процесс от повторения следующего 'ожидания, пока он не будет закончен. Правильно ли, что «Task.await» не блокирует какие-либо методы «Enum» по дизайну? –

+1

Имеет ли это значение? Скажем, что первый процесс занимает самое большое время - так что вы ждете этого, тогда, когда первый ожидание будет завершен, все остальные немедленно завершатся по мере завершения их процессов. – cdegroot

+0

Ну, это важно, когда я не понимаю, как он себя ведет. Не могли бы вы посмотреть на этот код: http://elixirplayground.com?gist=4682af479dbb1a4510b7deef373ca51e. Я действительно не понимаю, как журнал '' done async 2 ''предшествует второй« новой »задаче». –