首先,我对Elixir很陌生,所以这可能是一个误导的问题保持父进程活着
我有一个启动两个进程的函数。
第一过程使用的erlang:FS库来监视文件的变化的目录,然后将消息发送到所述第二处理。
第二个进程等待消息,在一个目录中的文件已发生变化,当它得到的消息,则运行重新生成一个HTML报告(这是一个发票)的功能。
它看起来像这样:
def run_report_daemon(line_item_dir) do
if Process.whereis(:html_daemon) == nil do
spawn(HTMLInvoiceDaemon, :run_daemon, [line_item_dir])
|> Process.register(:html_daemon)
end
if Process.whereis(:file_watcher) == nil do
:fs.start_link(:file_watcher, Path.absname(line_item_dir))
end
Process.sleep(1000)
run_report_daemon(line_item_dir)
end
这个“作品”,但让我困扰的是“睡眠”和递归调用。
我的问题:是否有更好的方式来保持包含派生我活着的过程功能的过程。如果没有递归调用和睡眠,它就会死亡,并将其他进程与它联系起来。通过递归调用并且不需要休眠,它会消耗大量的处理器资源,因为它可以非常快速地循环。
的,如果块是必要的,因为否则会反复产卵和注册过程。
我想用主管的,但当时我不知道如何启动:主管下FS的过程,甚至在这种情况下,我需要保持起动过程活着。
我怀疑我的问题是因为在花好月圆“做事的正确方法”的根本误解。
(注:我大概可以做整个事情没有产卵过程这样的,但它是一个学习的过程)
正是你在哪里发送消息'HTMLInvoiceDaemon'?你能发布更多的代码吗? – Dogbert
的[:FS库(https://github.com/synrc/fs)包括函数,允许另一个进程订阅以接收从信息:4fs过程。在HTMLInvoiceDaemon中,我订阅了来自file_watcher的消息,然后处理这些消息。 – Veen
'line_item_dir'是否是任意的,或者您在开始时是否知道这些?还有,他们中有多少人?我曾试图回答,但后来意识到,如果在应用程序启动时不知道输入内容会很难得到。 –