【问题标题】:large amount of data in elixir task长生不老药任务中的大量数据
【发布时间】:2017-10-21 10:45:36
【问题描述】:

我在 Elixir 上有一个应用程序,它应该接收大量数据,然后将数据分发到 n 个部分。

这些部分必须并行处理,但应限制同时处理的员工数量。作为处理的结果,员工返回大量值。

主进程在收到所有工作人员的结果后,将所有内容粘合到一个文件中。

通过Task让员工成为一个好主意吗?员工的进程必须返回大量数据会不会有问题?

或者最好用 GenServer 建立一个员工池,并进行同步调用?

【问题讨论】:

  • 使用File.stream从文件中读取数据,然后通过管道将其发送到Stream.chunk_by,并在其函数中将数据块调度到您提前设置的任何处理器(通过@987654324 @) 使用 elixir 的 send 机制。
  • 每次调用send都不会等结果返回再发送吗?
  • 不,你将它发送到数据到进程,然后它并行工作,然后它可以将其结果发送到另一个为你收集结果的节点。与此同时,您继续处理传入File.stream中的下一个块@
  • 您的问题似乎是Flow 的完美用例。
  • 我的方法是尝试记录 Elixir 可以产生的所有日志,甚至请求日志。

标签: elixir


【解决方案1】:

Task.async_stream 提供了一个简单的 API 来拆分工作,然后收集结果,同时限制并发:

文档中的示例:

max_concurrency = System.schedulers_online * 2
stream = Task.async_stream(collection, Mod, :expensive_fun, [], max_concurrency: max_concurrency)
Enum.to_list(stream)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2016-07-24
    相关资源
    最近更新 更多