1. ホーム
  2. python

[解決済み] スタンドアローンのイベントシステムを提供するPythonパッケージは?[クローズド]

2022-03-13 23:17:33

質問

を意識しています。 pydispatcher しかし、Pythonのイベント関連のパッケージは他にもあるはずです。

どのようなライブラリーがありますか?

私は、大規模なフレームワークの一部であるイベントマネージャーには興味がなく、むしろ簡単に拡張できる小さなベアボーンソリューションを使いたいと思っています。

どのように解決するのですか?

PyPIパッケージ

2022年1月現在、PyPIで公開されているイベント関連のパッケージです。 は、リリース日の新しい順に並んでいます。

まだまだあります

イベント、シグナル、ハンドラ、メソッドディスパッチ、フック、......など、さまざまな用語を使って、たくさんのライブラリの中から選ぶことができるのです。

上記のパッケージの概要と、ここの回答で紹介されているテクニックを押さえておこうと思います。

まず、用語について...。

Observerパターン

イベントシステムの最も基本的なスタイルは、「ハンドラメソッドのバッグ」であり、これは の単純な実装です。 Observerパターン .

基本的に、ハンドラメソッド(callable)は配列に格納され、イベントが「発火」したときにそれぞれ呼び出されます。

出版-サブスクライブ

Observerイベントシステムの欠点は、ハンドラを登録できるのが実際のイベント オブジェクト(またはハンドラリスト)。 そのため、登録時にはすでにイベントが存在する必要があります。

そのため、2つ目のスタイルのイベントシステムが存在します。 パブリッシュ・サブスクライブ・パターン . ここでは、ハンドラはイベントオブジェクト(またはハンドラリスト)ではなく、中央のディスパッチャに登録されます。 また、ノーティファイアはディスパッチャとしか会話しません。 何をリッスンするか、何をパブリッシュするかは は、名前(文字列)に過ぎない'signal'によって決定される。

Mediatorパターン

また Mediatorパターン .

フック

フック」システムは、通常、アプリケーションプラグインのコンテキストで使用されます。 アプリケーションの アプリケーションには固定の統合ポイント(フック)があり、それぞれのプラグインは は、そのフックに接続し、特定のアクションを実行する。

その他の「イベント

スレッディング.イベント は「イベントシステム」ではない という意味です。 これはスレッド同期システムで、あるスレッドが他のスレッドがEventオブジェクトに「シグナル」を送るまで待ちます。

ネットワークメッセージングライブラリもしばしば「イベント」という言葉を使いますが、これらはコンセプトが似ている場合もあれば、そうでない場合もあります。 もちろん、スレッド、プロセス、コンピュータの境界を横断することができます。例えば pyzmq , pymq , ツイスト , トルネード , イベント , イベントレット .

脆弱なリファレンス

Pythonでは、メソッドやオブジェクトへの参照を保持することで、それが削除されないようにすることができます。 ガベージコレクタによって これは望ましいことですが、メモリリークを引き起こす可能性もあります。 リンクされたハンドラは決して はクリーンアップされます。

イベントシステムの中には、これを解決するために、通常の参照ではなく弱参照を使用するものがあります。

各種ライブラリについて一言

オブザーバースタイルのイベントシステム。

  • zope.event は、この動作の骨子を示しています ( Lennartの回答 ). 注意: この例はハンドラ引数さえサポートしていません。
  • LongPokeの「呼び出し可能なリスト」。 のサブクラス化により、このようなイベントシステムを非常に簡素に実装できることがわかります。 list .
  • フェルクのバリエーション イベントフック も、callee と caller のシグネチャを確保する。
  • spassigのEventHook (Michael FoordのEvent Pattern)をそのまま実装したものです。
  • Josip's Valued Lessons イベントクラス は基本的に同じですが set の代わりに list を実装し、バッグを格納するために __call__ は、いずれも合理的な追加である。
  • PyNotify はコンセプトが似ていて、さらに変数と条件(「変数変更イベント」)の概念を提供しています。 ホームページは機能的ではありません。
  • アクセル は基本的にバッグオブハンドラで、スレッドやエラー処理などに関するより多くの機能を備えています。
  • python-dispatch から派生するソースクラスさえも必要とします。 pydispatch.Dispatcher .
  • バスレーン はクラスベースで、単一または複数のハンドラをサポートし、広範なタイプヒントを容易にします。
  • ピティコスの オブザーバー/イベント は、軽量なデザインです。

Publish-subscribe ライブラリ。

  • ブリンカー は、自動切断や送信者に基づくフィルタリングなどの気の利いた機能があります。
  • PyPubSub は安定したパッケージで、トピックやメッセージのデバッグや保守を容易にする先進的な機能を約束します" 。
  • ピューミッター は Node.js の EventEmitter2 を Python に移植したもので、名前空間、ワイルドカード、TTL を提供します。
  • PyDispatcher は、多対多の公開などに対する柔軟性を重視しているようです。 弱参照をサポートしています。
  • ルーイ は、PyDispatcher を作り直したもので、 "様々なコンテキストで動作するはずです"。
  • pypydispatcher はPyDispatcherをベースにしており、PyPyでも動作します。
  • django.dispatch は書き直された PyDispatcher です "インターフェースはより制限されますが、より高いパフォーマンスを発揮します"。
  • pyeventdispatcher は、PHP の Symfony フレームワークの event-dispatcher をベースにしています。
  • ディスパッチャ は django.dispatch から抽出されたものですが、かなり古くなっています。
  • Cristian Garciaの イベントマネージャー は本当に短い実装です。

その他

  • プラッギー が使用するフックシステムが含まれています。 pytest プラグインがあります。
  • RxPy3 はObservableパターンを実装し、イベントのマージ、リトライなどを可能にします。
  • Qtのシグナルとスロットは、以下のサイトから入手できます。 PyQt または PySide2 . これらは、同じスレッドで使用される場合、コールバックとして動作します。 または、異なる2つのスレッド間のイベント(イベントループを使用)として使用します。 シグナルとスロットは、以下のような制限があります。 から派生したクラスのオブジェクトでのみ機能します。 QObject .