[解決済み] スタンドアローンのイベントシステムを提供するPythonパッケージは?[クローズド]
質問
を意識しています。 pydispatcher しかし、Pythonのイベント関連のパッケージは他にもあるはずです。
どのようなライブラリーがありますか?
私は、大規模なフレームワークの一部であるイベントマネージャーには興味がなく、むしろ簡単に拡張できる小さなベアボーンソリューションを使いたいと思っています。
どのように解決するのですか?
PyPIパッケージ
2022年1月現在、PyPIで公開されているイベント関連のパッケージです。 は、リリース日の新しい順に並んでいます。
-
プラッギー
1.0.0
: 2021年8月 -
ピミッター
0.3.1
: 2021年6月 -
zope.event
4.5.0
: 2020年9月 -
python-dispatch(パイソンディスパッチ
0.1.31
: 2020年8月 -
RxPy3
1.0.1
: 2020年6月 -
ルーイ
2.0
: 2019年9月 -
PyPubSub
4.0.3
: 2019年1月 -
pyeventdispatcher
0.2.3a0
: 2018 -
バスレーン
0.0.5
: 2018 -
PyPyDispatcher
2.1.2
: 2017 -
アクセル
0.0.7
: 2016 -
ブリンカー
1.4
: 2015 -
PyDispatcher
2.0.5
: 2015 -
ディスパッチャ
1.0
: 2012 -
py-notify
0.3.1
: 2008
まだまだあります
イベント、シグナル、ハンドラ、メソッドディスパッチ、フック、......など、さまざまな用語を使って、たくさんのライブラリの中から選ぶことができるのです。
上記のパッケージの概要と、ここの回答で紹介されているテクニックを押さえておこうと思います。
まず、用語について...。
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の イベントマネージャー は本当に短い実装です。
その他
関連
-
python call matlab メソッドの詳細
-
[解決済み】ImportError: bs4という名前のモジュールがない(BeautifulSoup)
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] 億の相対的輸入
-
[解決済み] Pythonのsite-packagesディレクトリの場所を見つけるにはどうしたらいいですか?
-
[解決済み] pandasを使った "大量データ "ワークフロー【終了しました
-
[解決済み] 2次元アレイにおけるピーク検出
-
[解決済み] Pythonを使ってシステムのホスト名を取得するにはどうすればよいですか?
-
[解決済み] jQueryイベントKeypress。どのキーが押されたか?
-
[解決済み] pipでローカルファイルシステムフォルダからvirtualenvにPythonパッケージをインストールする。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PicgoのイメージベッドツールをPythonで実装する
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
Python入門 openを使ったファイルの読み書きの方法
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み] データ型が理解できない
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】cアンダースコア式`c_`は、具体的に何をするのですか?
-
[解決済み】ユーザーから1文字だけ読み取るには?
-
[解決済み】スレッドの例外を呼び出し側のスレッドでキャッチする?