【发布时间】:2017-12-07 23:02:59
【问题描述】:
我想创建一个类似这样的 Elixir 代码:
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
假设:
-
crawling函数将创建另一个 3Task - 每个
crawlingworker 可以花 3 秒时间跑步 -
queue可能有数百万条消息
我如何知道 Elixir 上并行进程的限制是多少?我怎样才能让它不坏?
【问题讨论】:
-
您为什么不利用Genstage 做这个?它提供了一种背压机制,消费者只会在生产者可用时要求生产者提供更多任务。您可以对其进行配置,以便在需要完成更多工作时动态生成消费者。通过这种方式,您可以最大限度地利用您的资源而不会爆炸。
-
@KevinJohnson GenStage 看起来棒极了!!!但是,如果我没有弄错,为了“消费”我的生产者(队列)得到的东西,我需要“初始化”一个生产者。所以,我希望你能帮助我解决以下问题: - 我是否需要初始化多个生产者以达到更多并行性? - 我可以动态地做到这一点吗?我的意思是,当我在消费者身上有更多“等待”的工作时,我会创造更多的生产者......提前致谢!