首先,我對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'是否是任意的,或者您在開始時是否知道這些?還有,他們中有多少人?我曾試圖回答,但後來意識到,如果在應用程序啓動時不知道輸入內容會很難得到。 –