2012-04-16 15 views
2

Pythonスクリプトの実行中のインスタンスすべてに更新イベントを通知する必要があり、できるだけシンプルにコードを保持したいと考えています。私は、実行中のプロセス間での通信経験はありません。これまで、私は各インスタンスが読み書きする構成ファイルを読み書きしていました。同じPythonスクリプトの複数の実行インスタンスに更新イベントを通知する必要があります

私はこの問題を解決する方法について私の頭を包むために書いた(シンプルなテンプレートの一種)いくつかの擬似コードを示します。空白を埋めるのを手伝ってください。覚えておいて、私はソケット、スレッドなどの経験がありません。

import process # imaginary module 

class AppA(): 
    def __init__(self): 
     # Every instance that opens will need to attach 
     # itself to the "Instance Manager". If no manager 
     # exists, then we need to spawn it. Only one manager 
     # will ever exist no matter how many instances are 
     # running. 
     try: 
      hm = process.get_handle(AppA_InstanceManager) 
     except NoSuchProgError: 
      hm.spawn_instance(AppA_InstanceManager) 
     finally: 
      hm.register(self) 
     self.instance_manager = hm 

    def state_update(self): 
     # This method won't exist in the real code, however, 
     # it emulates internal state changes for the sake of 
     # explaination. 
     # 
     # When any internal state changes happen, we will then 
     # propagate the changes outward by calling the 
     # appropriate method of "self.instance_manager". 
     self.instance_manager.propagate_state() 

    def cb_state_update(self): 
     # Called from the "Instance Manager" only! 
     # 
     # This may be as simple as reading a known 
     # config file. Or could simply pass data 
     # to this method. 


class AppA_InstanceManager(): 
    def __init__(self): 
     self.instances = [] 

    def register_instance(self, instance): 
     self.instances.append(instance) 

    def unregister_instance(self, instance): 
     # nieve example for now. 
     self.instances.remove(instance) 

    def propagate_state(self): 
     for instance in self.instances: 
      instance.cb_state_update(data) 

if __name__ == '__main__': 
    app = AppA() 

何か提案がありますか?

+0

あなたが "インスタンス"と言うとき、シェルスクリプトなどから複数の同時インタプリタを起動しているのですか、あるいは単一のPythonインタプリタインスタンスから複数のインスタンスを生成していますか?どのようなアプローチが有効になるかという点で違いがあります。 –

+0

うーん、正確にはわからない(私の無知に対する謝罪)。私は最初のスクリプトアプリケーションの各インスタンスのための "python.exe"(タスクマネージャで)の1つのインスタンスを見ることができるので、最初に信じています。それは役に立ちますか? – Joe

+0

はい、そうです。私はかなりあなたのシステムを大幅に再構築することなく、マルチスレッド/マルチプロセスを使用することを妨げることは間違いないと確信しています。プロセス間のデータフローを制御するには、DBやファイルなどの外部ソースを使用する必要があると思います。しかし、もし柔軟に再構築することができれば、mutliprocess/mutlithreadが望ましいかもしれません。 –

答えて

1

この種のデザインにはいくつかのオプションがあります。

このような種類のメッセージキューを使用することができます。 AMQPまたは何らかのZeroMQまたはそのようなもの。

または、Redisやその他の(メモリ内の)データベースを同期用に使用できます。

このようなものを使用したくない場合は、マルチプロセッシングモジュールの同期処理を使用できます。

プラットフォーム固有のIPCシステムを使用してください。 mmap、sysvソケットなどを介した共有メモリ

説明したようにしたい場合は、Twistedsパースペクティブブローカーを見ることができます。

+0

私はこのようなものをほぼ正確に入力しようとしていました。専用のサーバープロセスか、OPの例のようなリーダー選挙型の状況のどちらかを選ぶことについて具体的なポイントを立てようとしていました。 Redisは専用のデバイスアプローチであり、ZeroMQのようなメッセージキューはあなたにオプションを与えます。 – jdi

+0

Redisはパブリッシュ/サブスクライブメッセージキューを提供します。 – Marcin

+0

PythonはstdlibにQueueモジュールを持っています。しかしながら。私は "セッションマネージャー"のようなものが必要なのかと思っています。 "プロセス識別子"などで実行中のすべてのインスタンスを見つけることができる場合は、/。もしそうなら、私はただすべてのインスタンスを見つけることができ、メッセージや何かを渡すことによって新しい更新された設定ファイルを読むために各インスタンスに "通知"します。うーん。私はここでうんざりしています。私はこれらのコミュニケーションがどのように機能するかについての完全なばかだ。 – Joe

関連する問題