我有一个看起来像
的管道digits
|> Task.async_stream(__MODULE__, :filter, [s, values], timeout: :infinity)
|> Stream.drop_while(fn {_, k} -> k == :contradiction or k == [] end)
|> Stream.take(1)
这里是否定义了任何订单?或者只返回不满足while条件的第一个filter
的结果?
答案 0 :(得分:1)
Task.async_stream
has an option:ordered: true | false
。如果设置为true,则结果将与输入列表的顺序相同。当它为假时,结果将按任务完成的顺序排列。此选项的值默认为true
,因此在您的代码中,结果的顺序与输入列表的顺序相同。
iex(1)> [5, 4, 3, 2, 1] |> Task.async_stream(fn x -> :timer.sleep(x * 100); x end) |> Enum.to_list
[ok: 5, ok: 4, ok: 3, ok: 2, ok: 1]
iex(2)> [5, 4, 3, 2, 1] |> Task.async_stream(fn x -> :timer.sleep(x * 100); x end, ordered: false) |> Enum.to_list
[ok: 1, ok: 2, ok: 3, ok: 4, ok: 5]