2

複数のリソース (Web カメラ) に同時にアクセスする複数のクライアントにサービスを提供するプログラムを作成する必要があります。

例: クライアント A と B の両方が、2 台のパンチルト カメラ A と B の現在位置を要求します。クライアントがそのカメラに直接話しかけないようにする必要があります (多くのクライアントが存在する可能性があるため)。各クライアント(ソケットを介して接続する人)と各カムのプロセス。

クライアントがカム A の位置を要求すると、プログラムはそのカムの新しいプロセスをフォークし、そのプロセスはカム位置を 10 秒間繰り返しポーリングしてから終了します。その 10 秒以内に、任意のクライアントからの各位置要求は、この cam-A プロセスによって処理される必要があります。

問題は、cam プロセスがクライアント プロセスとどのように通信できるかということです。私の素朴なアプローチは、cam プロセスが書き込み、クライアント プロセスが読み取るグローバル変数 (camA-posX、camA-posY、camB-posX、camB-posY、...) を使用することです。フォークされたプロセス間のグローバルがまったく可能かどうかさえわかりません。

私の 2 番目のアプローチは、perlipc/Safe Pipe Opensのようにパイプを使用することですが、これは親子通信のみを対象としています。

別の問題: 新しい cam プロセスを fork する必要があるか、それともまだ実行中かを決定しなければならない誰か (親プロセス?) がいるに違いありません。

クライアント用とカメラ用の 2 つのプログラムを (2 番目の方法を使用して) 作成し、1 つのソケットを介して相互に通信する方がよい場合もあります。

カムとクライアントの数が増えた場合、負荷を分散するために全体をスケーリングする必要さえあるかもしれません。

4

1 に答える 1

2
  • グローバル変数は使用できません。プロセスがフォークされると、それらはメモリ空間を共有しなくなるため、グローバル変数はプロセス間で区別されます。これはスレッドでのみ行うことができ、通信に共有メモリを使用することは非常に慎重に行う必要があります (スレッド並行プログラミングで行うことと同様に:)

  • 下位レベルの IPC の場合は、次を使用しますIPC::Msg

  • 正直なところ、スケーリングについて心配する必要がある場合は、IPC の枠にとらわれず、実際のデータベースを使用して通信を管理することを強くお勧めします。

    トランザクションの原子性が保証されている限り、リレーショナル データベースでも noSQL データベースでもかまいません。mySQL は完全に正常に動作するはずです。

  • 別の同様のアプローチ (DB が少しやり過ぎの場合) は、ここで説明されているように、メッセージング キューを使用することです

  • 議論された他のいくつかの解決策:

于 2013-07-23T16:09:37.620 に答える