Skip to main content

publishsub

Python用の依存関係ゼロ軽量パブリッシュ/サブスクライブメッセージングライブラリ

ゲーム、GUIアプリケーション、並列処理通信に最適なシンプルで高速、依存関係のないpub/subライブラリです。

特徴

  • 🚀 依存関係ゼロ - 外部ライブラリ不要
  • 🧵 スレッドセーフ - マルチスレッドアプリケーションで安全に使用可能
  • 🔄 メモリ効率 - 弱参照を使用してメモリリークを防止
  • 🎯 シンプルAPI - 最小限のセットアップで簡単に使用可能
  • 🔍 デバッグサポート - 組み込みデバッグ機能
  • 📦 軽量 - 最小限のオーバーヘッドで高速パフォーマンス

インストール

pip install publishsub

クイックスタート

import publishsub as pubsub

# イベントハンドラを定義
def on_player_join(data):
    print(f"プレイヤー {data['name']} がゲームに参加しました!")

def on_game_over(data):
    print(f"ゲーム終了!最終スコア: {data['score']}")

# イベントを購読
pubsub.subscribe("player_join", on_player_join)
pubsub.subscribe("game_over", on_game_over)

# イベントを発行
pubsub.publish("player_join", {"name": "Alice", "id": 123})
pubsub.publish("game_over", {"score": 9500, "winner": "Alice"})

高度な使用法

クラスインスタンスの使用

from publishsub import PubSub

# 独自のインスタンスを作成
ps = PubSub()

# 購読してサブスクリプションIDを取得
sub_id = ps.subscribe("my_event", lambda data: print(data))

# イベントを発行
ps.publish("my_event", "Hello World!")

# IDを使用して購読解除
ps.unsubscribe("my_event", sub_id)

イベント管理

import publishsub as pubsub

# 購読者数を確認
count = pubsub.subscribers_count("my_event")
print(f"イベントの購読者数: {count}")

# 購読者のいるすべてのイベントを一覧表示
events = pubsub.list_events()
print(f"アクティブなイベント: {events}")

# 特定のイベントの購読者をクリア
pubsub.clear("my_event")

# すべての購読者をクリア
pubsub.clear()

デバッグモード

import publishsub as pubsub

# デバッグログを有効にする
pubsub.enable_debug(True)

# すべての操作がログに記録される
pubsub.subscribe("debug_event", lambda x: print(x))
pubsub.publish("debug_event", "デバッグ情報が表示されます")

使用例

ゲーム開発

import publishsub as pubsub

# ゲームイベント
def on_enemy_spawn(enemy_data):
    print(f"敵が出現: {enemy_data['type']}")

def on_player_damage(damage_data):
    print(f"プレイヤーが {damage_data['amount']} ダメージを受けました")

# ゲームイベントを購読
pubsub.subscribe("enemy_spawn", on_enemy_spawn)
pubsub.subscribe("player_damage", on_player_damage)

# ゲームループ内で
pubsub.publish("enemy_spawn", {"type": "ゴブリン", "x": 100, "y": 200})
pubsub.publish("player_damage", {"amount": 25, "source": "ゴブリン"})

GUIアプリケーション

import publishsub as pubsub

# UIイベントハンドラ
def on_button_click(data):
    print(f"ボタン {data['button_id']} がクリックされました")

def on_window_resize(data):
    print(f"ウィンドウサイズが {data['width']}x{data['height']} に変更されました")

# UIイベントを購読
pubsub.subscribe("button_click", on_button_click)
pubsub.subscribe("window_resize", on_window_resize)

# UIコードで
pubsub.publish("button_click", {"button_id": "save_btn"})
pubsub.publish("window_resize", {"width": 800, "height": 600})

並列処理

import publishsub as pubsub
import threading

# ワーカー間通信
def on_task_complete(data):
    print(f"タスク {data['task_id']} がワーカー {data['worker_id']} によって完了")

def on_error(data):
    print(f"タスク {data['task_id']} でエラー: {data['error']}")

# ワーカーイベントを購読
pubsub.subscribe("task_complete", on_task_complete)
pubsub.subscribe("error", on_error)

# ワーカースレッドで
def worker_thread(worker_id):
    # ... 作業を実行 ...
    pubsub.publish("task_complete", {"task_id": 123, "worker_id": worker_id})

# ワーカーを開始
for i in range(3):
    threading.Thread(target=worker_thread, args=(i,)).start()

APIリファレンス

関数

subscribe(event: str, callback: Callable) -> str

コールバック関数でイベントを購読します。

  • event: 購読するイベント名
  • callback: イベントが発行されたときに呼び出される関数
  • 戻り値: 購読解除に使用するサブスクリプションID

unsubscribe(event: str, subscription_id: str) -> bool

サブスクリプションIDを使用してイベントの購読を解除します。

  • event: イベント名
  • subscription_id: subscribe()によって返されたサブスクリプションID
  • 戻り値: 購読解除に成功した場合True

publish(event: str, data: Any = None) -> int

オプションのデータでイベントを発行します。

  • event: 発行するイベント名
  • data: イベントと一緒に送信するオプションのデータ
  • 戻り値: イベントを受信した購読者数

subscribers_count(event: str) -> int

イベントのアクティブな購読者数を取得します。

  • event: イベント名
  • 戻り値: アクティブな購読者数

list_events() -> List[str]

購読者のいるすべてのイベントのリストを取得します。

  • 戻り値: イベント名のリスト

clear(event: Optional[str] = None) -> None

イベントのすべての購読者をクリアします。イベントが指定されない場合はすべてクリアします。

  • event: クリアする特定のイベント、またはすべてをクリアする場合はNone

enable_debug(enable: bool = True) -> None

デバッグログを有効または無効にします。

  • enable: デバッグログを有効にする場合True、無効にする場合False

スレッドセーフ

このライブラリは完全にスレッドセーフで、追加の同期なしにマルチスレッドアプリケーションで使用できます。

メモリ管理

ライブラリはコールバックに弱参照を使用してメモリリークを防ぎます。購読されたメソッドを持つオブジェクトがガベージコレクションされると、それらの購読は自動的にクリーンアップされます。

パフォーマンス

  • 軽量: 最小限のメモリフットプリント
  • 高速: 高頻度なイベント発行に最適化
  • スケーラブル: 数千のイベントと購読者を効率的に処理

ライセンス

MIT License - 詳細はLICENSEファイルをご覧ください。

貢献

貢献を歓迎します!プルリクエストをお気軽にお送りください。

作者

tikipiyaが作成

Release files for publishsub 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for publishsub 1.0.0
File Size Uploaded
publishsub-1.0.0.tar.gz 19.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for publishsub 1.0.0
File Interpreter ABI Platform
publishsub-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 26.8 kB

Release files / publishsub-1.0.0.tar.gz

Download URL publishsub-1.0.0.tar.gz
Size 19.2 kB
Tags Source
SHA-256 checksum
How to use checksums
4fe04c8432512831579466fc9145b65ecbd011568cf08d893bd147c2f49aad6f
BLAKE2b-256 checksum
How to use checksums
3452d08ed36522b7467457ec0ded68dece0539a8a724ac04317c0469b1c58651
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.3

Release files / publishsub-1.0.0-py3-none-any.whl

Download URL publishsub-1.0.0-py3-none-any.whl
Size 7.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7c40122ed7e1c052d5eadd0f5ef1e36ac27be6713e4611f7daaddd645c0ccafe
BLAKE2b-256 checksum
How to use checksums
30f18c572258422953bd33d6f748ca20efc508e654b29fc8cd1424c7d1b06f7a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.3

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page