首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >灵丹妙药的工艺限制?

灵丹妙药的工艺限制?
EN

Stack Overflow用户
提问于 2017-12-07 14:49:48
回答 1查看 1.8K关注 0票数 4

我想创建一个类似于以下内容的Elixir代码:

代码语言:javascript
复制
def infinite_loop(created_workers \\ []) do
  case next_from_queue do
    {:ok, queue_msg} ->
      new_worker = Task.async(fn -> crawling(queue_msg) end)
      infinite_loop([new_worker | created_workers])
    {:error, :empty} ->
      created_workers.map(&Task.await/1)
  end
end

假设:

  1. crawling函数将创建另一个3 Task
  2. 每个crawling worker可以花费3秒的时间运行。
  3. queue可能有数百万条消息

我如何才能知道并行过程的极限是什么?我怎么才能不打破它呢?

EN

回答 1

Stack Overflow用户

发布于 2017-12-07 15:02:59

为此,我建议使用Task.async_streamTask.async_stream允许您并行处理流,同时限制并行运行的任务数量。虽然Erlang 20中进程数的默认限制是262144,但是如果您正在爬行一个站点,您可能需要一个更低的限制。

可以使用Stream.iterate从不断返回新项的函数创建流。

代码语言:javascript
复制
stream =
  Stream.iterate(next_from_queue(), fn _ -> next_from_queue() end)
  |> Stream.take_while(fn {:ok, _} -> true; {:error, :empty} -> false end)

因为您想在{:error, :empty}停下来,所以我们使用Stream.take_while来停止流。

然后像这样使用Task.async_stream

代码语言:javascript
复制
stream
|> Task.async_stream(fn {:ok, queue_msg} ->
  crawling(queue_msg)
end, max_concurrency: 16)

这将以最多16个任务并行运行流。最终结果将是crawling(queue_msg)的所有返回值的列表。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47697675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档