2

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()

助言がありますか?

4

1 に答える 1

1

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

AMQP や ZeroMQ など、この種のもののために作成されたメッセージ キューを使用できます。

または、Redis やその他の (インメモリ) データベースなどを同期に使用することもできます。

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

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

あなたが説明した方法で物事を行いたい場合は、Twisteds パースペクティブ ブローカーを見ることができます。

于 2012-04-16T16:55:16.967 に答える