You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用txdbus等待DBus信号触发?基于Twisted框架实现示例代码中onSignal方法调用的等待方案

如何使用txdbus结合Twisted等待DBus信号触发?

嘿,我来帮你拆解这个示例,看看它是怎么借助Twisted实现等待DBus信号触发的:

这个示例的核心是Twisted的事件循环(reactor)——它就像一个永不停歇的监听器,负责捕获所有异步事件(包括DBus信号),只要reactor在运行,程序就会一直等待信号触发回调函数。

示例代码的工作流程

咱们一步步拆解:

  1. 建立DBus连接:client.connect(reactor)是异步操作,用yield等待连接完成后,拿到DBus客户端实例。
  2. 获取远程对象:cli.getRemoteObject('org.example', '/Signaller')定位到DBus服务上提供信号的远程对象,这是后续监听信号的目标。
  3. 注册信号回调:robj.notifyOnSignal('tick', onSignal)告诉txdbus:当这个远程对象发出名为tick的信号时,立刻调用onSignal函数处理信号携带的参数(这里是tickCount)。
  4. 启动事件循环:reactor.run()是关键一步——启动后,Twisted的事件循环会持续监听DBus连接上的所有事件,不会主动退出,直到你手动停止它。

为什么程序能一直等待信号?

其实示例代码已经实现了等待逻辑:reactor.run()会让程序进入无限循环,时刻扫描DBus连接的信号事件。只要DBus连接保持活跃,程序就会一直等着tick信号触发onSignal函数。

额外小技巧

如果想在收到一次信号后就退出程序,可以修改onSignal函数:

def onSignal( tickCount ):
    print 'Got tick signal: ', tickCount
    reactor.stop()  # 收到信号后停止事件循环,程序自动退出

完整可运行示例(Python2)

#!/usr/bin/env python
from twisted.internet import reactor, defer
from txdbus import client, error

def onSignal( tickCount ):
    print 'Got tick signal: ', tickCount
    # 可选:取消注释下面一行,收到信号后停止程序
    # reactor.stop()

@defer.inlineCallbacks
def main():
    try:
        cli = yield client.connect(reactor)
        robj = yield cli.getRemoteObject( 'org.example', '/Signaller' )
        # 注册信号回调,监听'tick'信号
        robj.notifyOnSignal( 'tick', onSignal )
    except error.DBusException, e:
        print 'DBus Error:', e

reactor.callWhenRunning(main)
# 启动事件循环,持续等待信号
reactor.run()

内容的提问来源于stack exchange,提问作者RajaniKanth Reddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:12:33