【问题标题】:Elixir: GenStage topologyElixir:GenStage 拓扑
【发布时间】:2017-10-11 10:35:59
【问题描述】:

出于自学目的,我尝试学习 Elixir 并围绕 GenStage 图书馆转转。

我阅读了大部分文档并获得了它,但是我对我的特定域有几个问题。

我尝试构建一个网络抓取工具,它应该每天启动几次并进行一些抓取和后处理。

第一个问题

所以,我的最高生产者是 Stage,它发出 HTTP 请求并将它们传递给消费者。

这里如何处理“等待 6 小时”?

我应该只接受请求,但向消费者发送空事件吗?这听起来像是在浪费 CPU 周期。

也许,GenStage 不是处理此类事件的正确方法?

第二个问题

有时我需要将事件返回到链中。

  • ProducerConsumerA 加载页面#n
  • ProducerConsumerB 解析页面并将页面上找到的项目的事件发送给下一个消费者。但它也应该为下一页发送ProducerConsumerA 的事件(如果结果是分页的)

【问题讨论】:

  • 如果您要等待 6 小时 - 即在您的计算机上运行 Erlang VM 6 小时 - 启动您的 elixir 程序的 cron 作业可能会更有效。

标签: elixir genstage


【解决方案1】:

我个人认为 GenStage 对于您的尝试可能有点矫枉过正。特别是如果你每 6 小时刮一次。此外,如果您刚刚学习 Elixir,您可能会从更基本的方法开始。如果您觉得需要更多的流量控制,您可以随时进行重构。

我会创建一个主要的 GenServer 来串行执行抓取。您可以从要抓取的网站列表开始它,并让它通过列表工作。获取站点后,您可以启动 Task 来处理数据,然后获取下一个站点,每次都启动新的处理 Task

当您完成所有网站的抓取后,您可以使用Process.send_after 发送一条唤醒消息,该消息将开始下一个抓取周期。

这将使您对 Elixir 和 OTP 有一个很好的了解。一旦你完成了这一切,你就可以进一步研究 GenStage。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 2011-03-29
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    相关资源
    最近更新 更多