Elixir 长生不老药:GenStage拓扑

Elixir 长生不老药:GenStage拓扑,elixir,genstage,Elixir,Genstage,出于自我教育的目的,我试着学习长生不老药,并在GenStagelibrary周围绞尽脑汁 我阅读了文档,大部分都得到了它,但是对于我的特定领域,我有几个问题 我试图建立一个网页刮板,它应该每天启动几次,并做一些刮板和后处理 第一个问题 因此,我最重要的生产者是一个阶段,它发出HTTP请求并将它们交给消费者 我如何处理这里的“等待6小时” 我应该只接受需求,而向消费者发送空事件吗?这听起来像是在浪费CPU周期 也许,GenStage对于此类事件不是一种正确的方法 第二个问题 有时我需要将事件返回到

出于自我教育的目的,我试着学习长生不老药,并在
GenStage
library周围绞尽脑汁

我阅读了文档,大部分都得到了它,但是对于我的特定领域,我有几个问题

我试图建立一个网页刮板,它应该每天启动几次,并做一些刮板和后处理

第一个问题 因此,我最重要的生产者是一个
阶段
,它发出HTTP请求并将它们交给消费者

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

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

也许,
GenStage
对于此类事件不是一种正确的方法

第二个问题 有时我需要将事件返回到链

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

我个人认为GenStage可能有点过分了,因为你试图这么做。特别是如果你每6小时才刮一次。此外,如果你只是学习长生不老药,你可能需要从一个更基本的方法开始。如果您觉得需要更多的流控制,您可以随时在以后重构

我将创建一个主要的GenServer,它可以连续地进行刮片。您可以从要刮取的站点列表开始,并让它在列表中工作。获取站点后,您可以启动一个
任务
来处理数据,然后获取下一个站点,每次启动一个新的处理
任务

当您完成所有站点的报废后,您可以使用
过程。在
之后发送\u以发送唤醒消息,启动下一个报废周期


这将使你对长生不老药和OTP有一个很好的了解。一旦这些都起作用了,就可以进一步调查GenStage了

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