PyDispatcher demo



from pydispatch import dispatcher
from typing import Dict, List
import time


# 定义信号
class Signals:
    TASK_STARTED = 'task_started'
    TASK_COMPLETED = 'task_completed'
    TASK_ERROR = 'task_error'


# 任务管理器
class TaskManager:
    def __init__(self):
        self.tasks: Dict[str, List] = {}
        self._setup_signals()

    def _setup_signals(self):
        # 连接信号处理器
        dispatcher.connect(self._on_task_started, signal=Signals.TASK_STARTED)
        dispatcher.connect(self._on_task_completed, signal=Signals.TASK_COMPLETED)
        dispatcher.connect(self._on_task_error, signal=Signals.TASK_ERROR)

    def _on_task_started(self, sender, task_id, **kwargs):
        print(f"任务 {task_id} 开始执行")
        self.tasks[task_id] = {'status': 'running', 'start_time': time.time()}

    def _on_task_completed(self, sender, task_id, result, **kwargs):
        print(f"任务 {task_id} 完成,结果: {result}")
        self.tasks[task_id].update({
            'status': 'completed',
            'end_time': time.time(),
            'result': result
        })

    def _on_task_error(self, sender, task_id, error, **kwargs):
        print(f"任务 {task_id} 出错: {error}")
        self.tasks[task_id].update({
            'status': 'error',
            'end_time': time.time(),
            'error': str(error)
        })


# 任务执行器
class TaskExecutor:
    def __init__(self, task_id: str):
        self.task_id = task_id

    def execute(self):
        # 发送任务开始信号
        print('start>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
        dispatcher.send(
            signal=Signals.TASK_STARTED,
            sender=self,
            task_id=self.task_id
        )

        try:
            # 模拟任务执行
            time.sleep(2)
            result = f"Task {self.task_id} result"
            print('cccccccccccccccc>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')

            # 发送任务完成信号
            dispatcher.send(
                signal=Signals.TASK_COMPLETED,
                sender=self,
                task_id=self.task_id,
                result=result
            )

        except Exception as e:
            # 发送任务错误信号
            dispatcher.send(
                signal=Signals.TASK_ERROR,
                sender=self,
                task_id=self.task_id,
                error=e
            )


# 使用示例
def main():
    # 创建任务管理器
    manager = TaskManager()

    # 创建并执行任务
    task1 = TaskExecutor("task1")
    task2 = TaskExecutor("task2")

    # 执行任务
    task1.execute()
    task2.execute()

    # 查看任务状态
    print("\n任务状态:")
    for task_id, task_info in manager.tasks.items():
        print(f"{task_id}: {task_info}")


if __name__ == "__main__":
    main()








from pydispatch import dispatcher
from pydispatch.robustapply import robustApply


# 1. 定义信号处理器
def handler1(sender, **kwargs):
    print(f"Handler 1: 收到来自 {sender} 的信号")
    return "Handler 1 的响应"


def handler2(sender, data, **kwargs):
    print(f"Handler 2: 收到数据 {data}")
    return "Handler 2 的响应"


# 2. 连接信号处理器
dispatcher.connect(handler1, signal="test_signal")
dispatcher.connect(handler2, signal="test_signal")

# 3. 使用 send 发送信号
print("\n使用 send 发送信号:")
responses = dispatcher.send(signal="test_signal", sender="sender1", data="test_data")
print("Send 响应:", responses)

# 4. 使用 robustApply 直接调用处理器
print("\n使用 robustApply 调用处理器:")
result1 = robustApply(handler1, signal="test_signal", sender="sender1", data="test_data")
result2 = robustApply(handler2, signal="test_signal", sender="sender1", data="test_data")
print("robustApply 响应:", result1, result2)



posted @ 2025-05-20 14:05  AngDH  阅读(22)  评论(0)    收藏  举报