0

私はpythonが初めてなので、質問が事前に意味をなさない場合はご容赦ください。

main 関数を含む 1 つのファイル server.py を持つ Python メッセージング サーバーがあります。これにはクラス「*server」もあり、main はこのクラス「the_server」のグローバル インスタンスを定義します。同じファイルまたは差分モジュール (同じディレクトリ内) の他のすべての関数は、このインスタンスを「from main import the_server」としてインポートします。

今、私の仕事は、前述のメッセージング サーバーから最新のメッセージ ステータス (メッセージの数など) を取得できるメカニズムを考案することです。

これは dir 構造です: src/ -> すべての .py ファイル 1 つのファイルのみがメイン

同じディレクトリに、メイン関数が別のポートで接続をリッスンする別のステータスサーバーを作成しました。クライアントがメッセージステータスを要求するたびに、メッセージングサーバーで関数を呼び出して、期待される数値を返すことができることを望んでいます.

ステータスサーバーにグローバルインスタンス「the_server」をインポートするにはどうすればよいですか、それとも正しい方法ですか?

4

2 に答える 2

2

「ステータスサーバー」と「リアルサーバー」が同じプロセスで実行されていない限り(つまり、大まかに、一方が他方をインポートして開始しfrom main import the_serverます)、ステータスサーバーだけでは役に立ちません。the_serverこれにより、何もしていない完全に独立した新しいインスタンスが得られ、ステータスを報告できます。

問題を解決するには、いくつかの明白な方法があります。

  • Peter Wooster の提案に従って、既存のプロトコルを拡張してステータス関連のリクエストを処理することにより、ステータス サーバーを実サーバーに完全にマージします。
  • ステータス サーバーを実サーバーの非同期 I/O 実装にマージしますが、2 つの異なるポートでリッスンし、それぞれに異なるプロトコル ハンドラーを使用します。
  • ステータス サーバーを実サーバー プロセスにマージしますが、別の非同期 I/O 実装を使用します。
  • ステータス情報をオブジェクトに直接保存するのではなく、たとえば ammapまたは aに保存して、ステータス サーバーが同じ/etcを開くことができるようにします。そしてそれから読んでください。(オブジェクト自体を共有メモリに置くこともできるかもしれませんが、それを機能させることができたとしても、これはお勧めしません。)multiprocessing.ArrayServermmapServer

現在、サーバーで非同期 I/O をどのように処理しているかを説明していただければ、これらをより具体的にすることができます。ループを選択 (または poll/kqueue/epoll) しますか? 接続ごとのスレッド?魔法のグリーンレット?非魔法の協調スレッド (PEP 3156/tulip など)? 「私が知っているのは、twisted/ tornado/ gevent/などを使用していることだけなので、それが何をするか」だけでも十分です。

于 2013-01-17T01:03:03.770 に答える
2

おそらく単一のサーバーを使用し、複数の種類のメッセージをサポートするプロトコルを設計する必要があります。「send」メッセージは送信され、「recv」メッセージは既存のメッセージを読み取り、「status」メッセージはサーバーのステータスを取得し、「stop」メッセージはそれをシャットダウンします。

アイデアを得るために、REST などの既存のプロトコルを検討することもできます。

于 2013-01-17T00:50:07.863 に答える