2017-02-19 2 views
-1

私は複数のバックグラウンドプロセスを作成する必要があるウェブサイトを持っています。 各プロセスは20〜30分で生き残りますが、計算は行われません。代わりに、あるアプリケーションの状態を確認して、引数の特定のリストを渡します。それでおしまい。おそらく1時間に5つのタスクを作成します。エリクシルのバックグラウンドプロセス

これらのプロセスは、互いに通信する必要はありません。

エリクシルのすべてをどのように整理するのがよいでしょうか?タスクを経由しますか?それとも良い方法がありますか?

+0

監視された 'Task'を介して、または' GenServer'を介して、この記述に基づいて判断するのは難しいです。私はあまりにも広範な問題を閉じるために投票しました。 – mudasobwa

答えて

1

このような単純なスケジューラを作成するには、上記の関数から送信されたメッセージがinfoとして扱われるため、たとえば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

関連する問題