2016-11-14 16 views
0

私は次のことを行い、マルチスレッドperlスクリプトを持っています。見つかったファイルごとに、パス/名前をスレッドキューに追加します。パス/ファイルがすでにキューに入っているか、ワーカー・スレッドによって処理されている場合、エンキューはスキップされます。同期項目リストは、

2)12個のワーカースレッドが上記のキューからデキューし、ファイルを処理し、ハードディスクから削除します。

これは単一の物理サーバー上で動作し、すべて正常に動作します。

ここでは、同じフォルダ構造を検索し、エンキュー/処理するファイルを探して、最初のサーバーと同時に動作する2番目のサーバーを追加します。私は両方のサーバーにそれぞれが何をしているのかを知らせる手段が必要で、同じファイルを処理しないようにする必要があります。キューは最小で、20〜100アイテムです。リストは非常に動的であり、毎秒何度も変化します。

普通のファイルに書き込んだり読み込んだりするだけで、現在のアイテムリストを同期させることができますか?何か案は?

答えて

0

通常のファイルを使用することには非常に注意が必要です。ロックとキャッシュのセマンティクスを管理するのは難しいでしょう。

IPCは大変難しい話題です。サーバーとサーバーの両方を実行しているときは、実際には非常に乱雑です。 「ホストAが部分的な処理でクラッシュしたらどうなるでしょうか?」というようなもっと複雑なシナリオについて考える必要があります。

最初に私はあなたが(可能な限り)あなたのプロセスを冪等にする必要があることをお勧めします。具体的には、両方のサーバが同じものを処理してしまった場合、害はありません。それは単に「非効率的」です。

私はあなたにこれを行う方法を伝えることはできませんが、一般的なのは、努力の重複を許可(および破棄)することです。

異なるサーバー上の2つのプロセスを同期させるという点では、ファイルがトリック共有ファイルシステムを実行するとは思わない。IPCはキャッシングのためにほぼリアルタイムで動作するようなものではない。 NFS上のデフォルトのキャッシュ・ラグは、60秒程度です。

私はあなたがsocketsの点で考えるとお勧めします。彼らはサーバーからサーバーIPCのかなり標準的な方法です。キュー内の「保留中の」アイテムをすでに確認しているので、これを展開して他のホストに問い合わせます(注記 - エンキューする前に、オフラインかそれ以外の場合は何をするかを考慮してください)。

ここで注意しなければならないのは、IPCが少なくても並列処理がうまく機能します。ネットワークを介して話すことは、一般にディスクと話すことよりも少し速いですが、プロセッサが動作する速度よりもかなり遅いです。だから、あなたが各ファイルごとに更新する必要のないキャッシング/ロック機構の仕組みを作ることができれば、はるかにうまくいくでしょう。

+0

2つのプロセスが同じファイルを引き継ぐときにファイルを害することはないので、システム(Linuxボックスのffmpeg)は "自己冪等"のようです。 私は非常にソケットソリューションを気に入っています。おそらく私のネットワーキングの背景に偏っているでしょう(私はプロプログラマーではありません)。私はUDPシグナリングで動作しているのを見ることもできます。ここでは、リスト全体を通してTCP接続を読み込むのではなく、他の誰かがエンキューされる次のファイルを保持しているかどうかを尋ねます。 とにかく、私はしばらくそれを考えて、これがうまくいくかどうかを報告します(まだプロトタイププロジェクトです)。 –