首页 / PYTHON / python-事件处理的扭曲模式
python-事件处理的扭曲模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-事件处理的扭曲模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4244字,纯文字阅读大概需要7分钟。
内容图文
![python-事件处理的扭曲模式](/upload/InfoBanner/zyjiaocheng/680/4a495dccb6c64df79531a268301bacc4.jpg)
(也欢迎以更好的形式帮助您解决此问题)
我正在寻找一种实现与互联网完全无关的异步软件的工具.我还获得了一份Twisted Network Programming Essentials的副本,该副本非常令人失望.它以及几乎所有其他教程似乎都只将twist视为网络客户端,使用内置事件处理程序,而静默使用内置胶水代码,这很难一概而论.
对于上下文,我的应用程序希望使用串行/ pyserial与硬件设备进行对话,并使用Qt提供gui.我什至还没有开始担心Qt反应器(它似乎是蠕虫罐头的另一个承诺)或移植到Windows的地步.
首先,我使用的是扭曲选择反应堆,在其中添加了处理udev事件的Protocol FileDescriptor.到目前为止,我的工作原理是,udev事件触发了协议中的功能(eventReceived).
以下是协议及其添加到反应堆的方式:
class UdevMonitorListener(Protocol):
def __init__(self, _reactor=None):
if _reactor is not None:
self._reactor = _reactor
else:
self._reactor = reactor
self.subsystem = 'tty'
self.monitor = None
def startListening(self):
logger.info("Starting UdevMonitorListener")
self.monitor = UdevMonitor(self._reactor, self, self.subsystem)
self.monitor.startReading()
def eventReceived(self, action, device):
if device in connected_devices.udev_ports:
if action == u'remove':
connected_devices.remove_by_udev_port(device)
if action == u'add':
if is_device_supported_from_udev_port(device):
if device not in connected_devices.udev_ports:
connected_devices.append_by_udev_port(device)
def init(_reactor=None):
monitor_protocol = UdevMonitorListener(_reactor)
monitor_protocol.startListening()
函数init()由Reactor.run()之前的Reactor.callWhenRunning()调用.如文件描述符所预期的那样,调用了eventReceived函数.如果有帮助,我也可以在此处添加该代码.
我想要的是eventReceiveved触发反应堆中的某种事件,其他事件可以对此做出反应.这段代码不必关心谁在使用它,而该代码也不应该在乎谁在生成它.这些事件之间的距离不远,而且我似乎找不到能够干净地执行此操作的接口.预计这些事件不会经常发生,但是它们永远不会“结束”.如果要使用延迟,则它必须具有某种“刷新”自身的方式以等待下一个事件.处理此类事件的常用模式是什么?
编辑:
为了后代和其他任何人看,其余代码:
(从https://gist.github.com/dpnova/a7830b34e7c465baace7起)
class UdevMonitor(FileDescriptor):
"""
File Descriptor for pyudev.Monitor.
@see: U{http://packages.python.org/pyudev/api/monitor.html}.
"""
def __init__(self, _reactor, protocol, subsystem=None):
FileDescriptor.__init__(self, _reactor)
# Set up monitor
context = pyudev.Context()
self.monitor = pyudev.Monitor.from_netlink(context)
if subsystem:
self.monitor.filter_by(subsystem=subsystem)
# Connect protocol
assert isinstance(protocol, UdevMonitorListener)
self.protocol = protocol
self.protocol.makeConnection(self)
def fileno(self):
"""
Return monitor's file descriptor.
"""
return self.monitor.fileno()
def startReading(self):
"""
Start waiting for read availability.
"""
logger.debug("starting udev monitor fd")
self.monitor.start()
FileDescriptor.startReading(self)
def doRead(self):
"""
An event is ready, decode it through Monitor and call our protocol.
"""
logger.debug("udev reports event available")
event = self.monitor.receive_device()
if event:
action, device = event
self.protocol.eventReceived(action, device)
def writeSomeData(self, data):
raise IOError("You can't write to a udev Monitor")
或包括connected_devices和搜索设备在内的完整模块的位置为https://gist.github.com/chintal/2511459c02a9767deb5d
解决方法:
What I would like is for eventRecieved to trigger some sort of event in the reactor which something else can react to. This code shouldn’t care who’s consuming this, and that code shouldn’t care who’s generating it.
在Twisted和使用Twisted的应用程序中广泛使用的执行此操作的模式是“进行函数调用”(也许是方法调用).
反应堆本身不能提供良好的单进程消息总线.几乎没有动力将其组合为一个,因为在一般情况下,函数调用本身可以很好地工作,当您遇到不常见的,专门的情况,而实际上情况并非如此时,很难做一件好事.这样,您仍然只为Twisted可能的受众群体提供了很小的一部分).
您的代码已经包含了我正在谈论的那种例子. UdevMonitor调用UdevMonitorListener.event(当我猜到)某种事件从udev系统中发出时接收.
重复一遍.给您的UdevMonitorListener引用另一个对象,并在适当的时间对该对象调用一些方法.例如:
class UdevMonitorListener(object):
def __init__(self, device_listener, _reactor=None):
...
self.device_listener = device_listener
def eventReceived(self, ...)
...
self.device_listener.some_device_thing_happened(...)
还要注意,我将基类更改为对象.协议是IProtocol实现的一个方便的基类-但这不是UdevMonitorListener的功能,因此协议不是基类的好选择.
内容总结
以上是互联网集市为您收集整理的python-事件处理的扭曲模式全部内容,希望文章能够帮你解决python-事件处理的扭曲模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。