0

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

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

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

第一个问题

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

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

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

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

第二个问题

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

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

1 回答 1

0

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

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

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

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

于 2017-05-12T07:58:52.570 回答