我有一个包含两个IO重的函数的管道,它们同时在一组项目上运行。
第一个func1
非常常见,我常常只想要func1
的响应。其他时候,我想将func1
的结果与其他函数func2
一起处理。
组成Task.async_stream之间有什么权衡(性能/开销,惯用性),即
enum
|> Task.async_stream(Mod1, :func1, [])
|> Task.async_stream(Mod2, :func2, [])
...
VS。传递一个延续并为func1
和func2
使用一个Task.async_stream,即
enum
|> Task.async_stream(Mod1, :func1_then, [&Mod2.func2/arity])
...
func1_then
在正常Mod2.func2
计算结束时调用函数参数(func1
)?
答案 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()