关于使用 D-Bus 异步方法调用的 Python 中的线程安全

Posted

技术标签:

【中文标题】关于使用 D-Bus 异步方法调用的 Python 中的线程安全【英文标题】:On thread safety in python using D-Bus asynchronous method calls 【发布时间】:2011-03-03 22:37:27 【问题描述】:

我编写了一个使用 D-Bus 进行异步方法调用的 python 类。当我的 reply_handler 被调用时,它将数据存储在列表中。这个列表可以同时被另一个类方法使用。是安全的还是我只能使用像 Queue 类这样的同步数据结构?

【问题讨论】:

【参考方案1】:

如果您不修改回调上下文之外的列表,那么您不一定需要同步 - 您只需要注意列表对象的状态是可变的。

如果必须在回调处理程序以及主执行上下文(或其他线程等)中修改列表,那么是的,您将需要同步。

Python 同步 Queue 自然地适用于消息泵 - 允许您按照事件在您自己的上下文中出现的顺序顺序执行操作。这也有利于代码的简单性和可读性,因为主要的状态变化更容易跟踪。回调通常不应该太复杂,因为调用回调的外部上下文不应该(也可能不需要)处理代码引发的异常。还有潜在的时间考虑 - 回调将阻塞异步发射器的上下文 - 所以保持处理程序简短和甜蜜也很好。

【讨论】:

谢谢。在我的情况下,在外面修改列表是很常见的。所以我决定只使用队列将传入的数据存储在reply_handler 中。程序的主循环定期检查此队列并将其内容安全地添加到列表中。

以上是关于关于使用 D-Bus 异步方法调用的 Python 中的线程安全的主要内容,如果未能解决你的问题,请参考以下文章

如何找到在 D-Bus 接口中公开的方法

在发出 dbus-send 命令后,如何使用 C 调用方法?

D-Bus D-Feet 发送字符串字典,Python 语法变体

调用 ACPI/D-bus 运行 ruby​​ 脚本

如何为 D-Bus 方法创建 String, Variant 的字典?

关于python中同步异步,阻塞非阻塞的理解