撰写Task.async_stream与继续传递

时间:2017-04-25 01:11:08

标签: concurrency task elixir

我有一个包含两个IO重的函数的管道,它们同时在一组项目上运行。

第一个func1非常常见,我常常只想要func1的响应。其他时候,我想将func1的结果与其他函数func2一起处理。

组成Task.async_stream之间有什么权衡(性能/开销,惯用性),即

enum
|> Task.async_stream(Mod1, :func1, [])
|> Task.async_stream(Mod2, :func2, [])
...

VS。传递一个延续并为func1func2使用一个Task.async_stream,即

enum
|> Task.async_stream(Mod1, :func1_then, [&Mod2.func2/arity])
...

func1_then在正常Mod2.func2计算结束时调用函数参数(func1)?

1 个答案:

答案 0 :(得分:3)

如果两个函数都是IO绑定的,那么第一个示例不应该有任何问题:

enum
|> Task.async_stream(Mod1, :func1, [])
|> Task.async_stream(Mod2, :func2, [])

如果您确实想要折叠这两个调用,我不会使用延续样式,只需将它们传递给传递给Task.async_stream/3的lambda:

enum
|> Task.async_stream(fn x -> x |> Mod1.func1() |> M2.func2() end)

或者,您可以考虑使用Flow

enum 
|> Flow.from_enumerable()
|> Flow.map(&Mod1.func1/1)
|> Flow.map(&Mod2.func2/1)
|> Flow.run()