PyDispatcher 介绍(官网翻译版本)

PyDispatcher简介

PyDispatcher 为Python程序员提供:" 多个生产者-多个消费者的" 的信号注册和路由服务的多用途基础架构。 这种机制在Python Cookbook 里被高度评价。本项是在多个项目的开发经验基础上总结并加强它(信号机制)。项目主要贡献者是 Mike Fletcher ,该项目的一个衍生版被用于django web项目中。

 

PyDispatcher 能做什么:

1. 提供中央式的信息传递传递服务(在本程序内将信息传递到目标对象),使你可以注册无限多的从sender接受信号的回调函数(callable objects)

注册可以是针对所有sender、特定sender或者匿名消息的任意signal 或者特定signal.

一个信号将会传递信息到所有正确的接受者手里,这样所有的接受者将不会互相干扰。

不需要发送者(sender)或者接受者(receiver)做特异性配置,所有的对象包括None都可以做sender ,所有的可调用对象都可以做receiver

不需要我们的对象 继承或者实现特定的接口

这套系统使用弱引用(weak references)来注册接受对象,使得对象的生命周期不会被 PyDispatcher 影响到(当你注册的receiver 消逝后,在pydispatcher中注册的对象也会消逝)

    对常见的瞬态对象(例如方法的实例)是用复合的弱引用来存储的

支持丰富的signal类型,只要hashable后可以索引的对象就可以用,不然的话对于程序调用不透明(变址无法正确调用).

允许sender发出 部分reciver无法处理额参数,调度程序会自动剔除接受者无法接受的参数,这样就可以用非常简单的函数来注册部分receiver,同时还可以将更复杂的参数传递给更高基本的函数。

 

这种dispatcher机制对于构建MVC类型的应用尤其好用(不希望构建的模型对象 对事情/事件 必须感知的情况)。

如何获得和安装 

PyDispatcher 支持通过标准python distutils安装包,可以通过PypI方式安装:

pip install PyDispatcher

PyDispatcher 不包含任何二进制包,因此安装应该不会出现任何问题PyDispatcher是用 bzr 项目的Launchpad 方式来维护的,想要协助开发请:

bzr branch lp:~mcfletch/pydispatcher/working

你可以通过Launchpad 来进行pull request 或发邮件

bzr send --mail-to=mcfletch@vrplumber.com

PyDispatcher是一个深度依赖于 python 弱引用对象的,我们发现了几个用户使用弱引用时候后需要注意的错误:

当使用Python 2.2.2时候,使用弱引用会让程序关闭的时候用来销毁弱引用的代码会导致内存访问错误,这里墙裂建议使用pydispathcer时候用2.2.3以后的版本

当时用python 2.3.2时候会有个更细微的错误,同样是弱引用销毁代码会引起segfaults(段错误)这个错误的修复代码没有被用在python 2.2.x里的PyDispatcher 所以你如果使用python 2.2.3的版本的你可能会碰到这个错误(段错误)

文档

你可以在发行版的 examples 文件夹里找到使用案例,对于使用而言dispatcher的模组使用参考目前是主要的信息来源。

PyDispatcher欢迎使用的用户对 pydispatcher-dev分支的代码贡献,建议 和反馈 具体请看邮件列表

用途

置一个接受signals信号的函数:

 

from pydispatch import dispatcher
SIGNAL = 'my-first-signal'

def handle_event( sender ):
    """Simple event handler"""
    print 'Signal was sent by', sender
dispatcher.connect( handle_event, signal=SIGNAL, sender=dispatcher.Any )
注:用dispatcher.Any 指代的类的意思是 他可以接受任意sender的 signal 为 SIGNAL 的信号
发送信号的方法:
first_sender = object()
second_sender = {}
def main( ):
    dispatcher.send( signal=SIGNAL, sender=first_sender )
    dispatcher.send( signal=SIGNAL, sender=second_sender )
会让控制台输出如下:
Signal was sent by <object object at 0x196a090>
Signal was sent by {}
Handler Functions 处理函数(调起函数)
对handler函数的定义相对宽松,一个处理函数可以仅仅定义当信号发出时候 ,自己想要接受的参数。Sender 可以添加额外的参数来限制其
被用来阻止更宽泛的handler来接受自己发出的信号。
def handle_specific_event( sender, moo ):
    """Handle a simple event, requiring a "moo" parameter"""
    print 'Specialized event for %(sender)s moo=%(moo)r'%locals()
dispatcher.connect( handle_specific_event, signal=SIGNAL2, sender=dispatcher.Any )
这个绑定语句 绑定的是当信号 SINGNAL2发出时候 附带moo参数的 所有sender 的信号将会调起 
handle_specific_event 而没有参数moo sender将会被忽略。(译者注 靠接受参数列表区分handler)


所有handler 一定可用的参数:
sender 一个Python object 指代的发送者,如果是匿名消息则会给定dispatcher.Anonymous 对象
signal 一个发送的Signal对象
位置参数和关键词参数 ,如果指定了位置参数,那么将会按照发送时候的顺序填上(译者注 用关键词参数填上位置参数的空)这会导致
当handler 既指定了位置参数 又指定了关键词参数时候 关键词参数会填到位置参数上 造成错误 建议使用关键词参数。

真实案例
OpenGL ....后面的没啥用 译者懒得翻译...


 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值