2017-02-19 40 views
-1

我有一個網站,我必須創建多個後臺進程。 每個進程最多隻能存活20-30分鐘,並且不會進行任何計算,而只會在一分鐘內檢查某個應用程序的狀態,並將其傳遞給某個參數列表。而已。據說每小時我會創建5個這樣的任務。Elixir的後臺進程

這些過程不必互相通信。

如何組織Elixir中的所有內容?通過任務?或者,還有更好的方法?

+0

通過監控'Task',或者通過'GenServer',很難說出這個描述。我已經投票決定把這個問題過於寬泛。 – mudasobwa

回答

1

要製作這樣一個簡單的調度程序,您可以使用Process.send_after與GenServer的handle_info結合使用,因爲從上述函數發送的消息是作爲信息處理的。

例如,

defmodule YourGenServer do 
    use GenServer 

    def init(initial_value) do 
    Process.send_after(self, :check_state, 1000 * 60 * 20) # 20 minutes delay 
    end 

    def handle_info(:check_state, state) do 
    # do the task 
    Process.send_after(self, :check_state, 1000 * 60 * 20) 
    end 
end 

有什麼更好的解決方案呢?任務和代理也是GenServers,只是他們的API更簡單。我在我的示例GenServer中使用它來展示它的樣子。對你來說最好的想法是使用包裝器,它將服務器的回調封裝在引擎蓋下,如果你想改變引擎,你就可以順利地進行。

+0

我明白這個例子是人爲設計的,但它缺少最複雜的部分:監督是如何完成的(如果有的話)。我會產生一個'代理程序',它負責監督它的嵌套任務。 – mudasobwa

+0

這取決於如何檢查應用程序的狀態是非常重要的 - 如果這很重要,我會爲主管使用專門的工作人員,並在每次前一次失敗時重新創建新進程。我想這只是一張支票,所以即使5個任務中的3個可以工作,也沒關係。 – PatNowak