运行 GLib.MainLoop 每次迭代的函数

Run a function at every iteration of a GLib.MainLoop

我正在编写一个使用 PyDBus 和 GLib 的简单 Python3 程序。

我正在尝试使用 PyDBus 在 Raspberry Pi GPIO 引脚上检测到边沿事件时发送信号。

为此,需要在主循环的每次迭代中调用执行此任务的函数。我已经看到 timeout_add 函数执行类似的操作;但是,timeout_add 仅每 interval 毫秒运行一次我的函数。

有没有办法在每次迭代时调用它?

使用g_idle_add()。它创建了一个没有先决条件和低优先级的 GSource,因此它的回调函数在每次主上下文迭代中执行一次,优先级低于其他未决事件。

如果您需要提高优先级,请类似地使用 g_idle_add_full()


不过,正如@nemequ 上面所说,架构上最好的解决方案是编写您自己的 GSource 实现(请参阅 GSourceFuncs 的文档),它的行为与使用创建的源相同g_idle_add(),或者可以通过了解您正在查询的 I/O pin 的具体信息来提高性能。这完全取决于 API 内核为该 I/O 引脚公开,以及如何从用户 space.

中进行轮询

documentation on writing a custom GSource here.