2017-08-22 1 views
0

私は、何千ものアカウントを処理したいワーカーのキューを持っています。彼らはそれぞれモデルを使って予測を行います。このモデルは、ハードドライブ上に用意されていなければならないファイルです。最初のプロセスがモデルファイルが存在しないことを検出すると、モデルファイルが作成されます。私はモデルファイルを検出する最初のプロセスが存在しないことを確認して、他のプロセスが起動前にモデルの準備を完了するのを待っている間にモデルファイルを作成できるようにします。エリクシルでファイルを処理する最初のプロセスを保証する

ミューテックスにはを使用することをお勧めしますが、私はエージェントを起動する方法がわからないので、各プロセスがエージェントが進行するように指示するまで待ちます解放されます)。 Agentが正しい解決法ではないかどうかを知りたいと思っています。

分散ロックが不要なので、ノード/インスタンスごとにモデルを生成しても構いません。上記の私のコメントにエラボレーション

+2

なぜ、準備を同期的に実行しないのですか?すべてのプロセスを処理する前になぜ準備を実行しないのですか?経験則では、OTPにミューテックスが必要と感じる場合、あなたは間違いの可能性が最も高いです。 – mudasobwa

+0

アカウント情報が変更された場合に応答して起動しますので、deploy/instanceを起動しない限り、必要なプロセスが起動する前に実行される保証時間はありません。また、ファイルを定期的に再生成する必要があります。古いファイルを無効にすると、新しいファイルを作成する前に新しいファイルを準備する場所が無くなり、 – atomkirk

+1

が起動しません。スーパーバイザがあり、ファイルを作成してからすべてのワーカーを生成します。有効期限が切れたときにファイルを再検証するために必要なのは、このsupervisor_を殺すための_justだけです。 – mudasobwa

答えて

0

、最良のシナリオは、私の意見では、次のようになります。

- 1は、基本的には、ファイルを作成し、すべての労働者を生成しますSupervisorを作成します。

file = FileProducer.create() 
children = Enum.map(1..20, 
    &worker(FileHandler, [file], id: :"FileHandler_#{&1}") 
) 
supervise(children) 

- この監督はApplicationによって監督される

(監督ツリーに含まれています。) - とすぐにファイルの有効期限が切れて、はちょうどこのスーパーバイザを殺します。アプリケーションがそれを復活させ、起動ループ全体がパススルーされます。

関連する問題