【问题标题】:How to use Elixir OTP Supervisor/GenServer for quick jobs如何使用 Elixir OTP Supervisor/GenServer 进行快速工作
【发布时间】:2016-06-23 05:49:05
【问题描述】:

我不想有一个长时间运行的过程。但同时,要使用Supervisor,以及worker进程。我该怎么办?

场景:每天午夜,我使用受监督的进程从外部 API 获取数据。

但如果工人完成他们的工作,我不希望该流程运行到第二天。

就我而言,始终存在 1 个主管、5 个 poolboy 进程。

既然 erlang 进程很便宜,而且它们是空闲的,我是否应该让我的 applications 的主管部分每次都启动,然后让它空闲?

或者我应该在工作进程完成后尝试杀死主管?

当我执行:observer.start 时,我可以看到我的几个依赖包已经启动了进程。这个可以吗?我什么时候应该担心进程的数量?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    几个过程真的没什么大不了的。对于我处理的一个应用程序,我们测试了使用几百万个 poolboy 进程启动它,并且只需要 1GB 多一点的 RAM 就可以做到这一点。根据the docs

    A newly spawned Erlang process uses 309 words of memory in the non-SMP emulator without HiPE support. (SMP support and HiPE support both add to this size.)
    

    所以说真的,不用担心依赖项会产生太多进程。这没什么大不了的。

    至于您的结构性问题,一种可能性是使用simple_one_for_one 主管。然后,您只需有一个 cron 作业,它会向正在运行的 VM 发送一条消息(如果您有一个 Web 服务器,则可能是一个 cURL POST 请求)以执行您的批处理作业,或者使用timer module以指定的时间间隔运行作业。

    编辑:Elixir 在Process module 中具有类似的功能。请参阅 Jose Valim 对a similar question 的回答。

    无论您选择哪种开始工作,您都可以让他们简单地致电supervisor:start_childSupervisor.start_child,根据您使用的语言,为您的工作开始工作。

    【讨论】:

      猜你喜欢
      • 2016-03-20
      • 2017-10-16
      • 2019-10-09
      • 2017-09-19
      • 2021-03-16
      • 2017-09-08
      • 2016-03-14
      • 2015-01-13
      • 2018-01-13
      相关资源
      最近更新 更多