dbus-python 在 thread 中运行时会随机出错

本文记录了在使用dbus-python进行多线程操作时遇到的崩溃问题,并提供了一个简单的测试代码示例。该问题在PC上表现得较为随机。

转载时请注明出处和作者联系方式:http://blog.youkuaiyun.com/mimepp

作者联系方式:YU TAO <yut616 at sohu dot com> 

关键字: linux,dbus-python, python, dbus, thread, safety

这里记录一下 dbus-python 在 thread 运行时,会有 crash 的情况。

测试代码:

import dbus
import traceback

import threading

def test_function(index):
        bus = dbus.SessionBus()
        try:
                bus_obj = bus.get_object("org.freedesktop.DBus", "/org/freedesktop/DBus")
                print "index: %d" % index
        except dbus.DBusException:
                print "dbus.DBusException"
                traceback.print_exc()
        return False

if __name__ == '__main__':
        for i in range(1,10000):
                threading.Thread( target = test_function, args = (i, ) ).start()


这里测试代码只用到了 get_object 方法,就会引起问题了。

PC 上是很随机的出现 bug,crash 结果如下:

index: 8898
index: 8899
index: 8900
index: 8901
index: 8902
 index: 8878
index: 8904
Segmentation fault

Pythondbus-python库中,使用Properties接口主要是通过`dbus.Interface`类来实现的。以下是一般的步骤: 1. **导入模块**: 首先,你需要导入`dbus`和`dbus.service`模块,因为`dbus.Interface`属于`dbus.service`下的一个类。 ```python import dbus from dbus.mainloop.glib import DBusGMainLoop ``` 2. **连接到bus和接口**: 创建DBus主循环并连接到特定的服务。假设我们要连接到名为"com.example.MyService"的服务,其中包含Properties接口。 ```python bus = dbus.SessionBus() service_name = 'com.example.MyService' obj_path = '/MyObject' # 对象路径,每个服务都有其唯一的路径 props_iface = dbus.Interface(bus.get_object(service_name, obj_path), 'org.freedesktop.DBus.Properties') ``` 3. **读取和写入属性**: 调用`Get()`方法来读取属性值,如`props_iface.Get('section', 'property')`。如果想要写入新值,使用`Set()`方法,如`props_iface.Set('section', 'property', value)`。 4. **监听属性变化**: 可以注册一个信号处理器来响应属性的变化。比如,使用`props_iface.connect_to_signal('PropertiesChanged', callback_function)`,其中`callback_function`会在属性改变时被调用。 5. **清理连接**: 当完成交互后,记得关闭主循环以释放资源。 ```python def callback_function(*args): section, property_name, old_value, new_value = args print(f"{section}.{property_name} changed from {old_value} to {new_value}") props_iface.connect_to_signal('PropertiesChanged', callback_function) # 等待属性变化发生... ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值