python mainloop,添加定时事件

sve*_*ema 3 python gobject timer

我有一个基于 D-Bus 事件执行操作的 Python 脚本,其简化版本:

import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject

DBusGMainLoop(set_as_default=True)
bus = dbus.SystemBus()

# Initialize a main loop
mainloop = gobject.MainLoop()
bus.add_signal_receiver(cb_udisk_dev_add, signal_name='DeviceAdded', dbus_interface="org.freedesktop.UDisks")
bus.add_signal_receiver(cb_udisk_dev_rem, signal_name='DeviceRemoved', dbus_interface="org.freedesktop.UDisks")

mainloop.run()
Run Code Online (Sandbox Code Playgroud)

这将调用 cb_udisk_dev_add 和 -rem 回调函数。现在我想要一个定时回调函数,我喜欢调用它,比如每 5 分钟调用一次。

看来 mainloop.run() 是一个被阻止的函数,所以我想我需要向主循环添加一个计时器......?

我尝试实现一些定期执行的函数: Executing periodal actions in Python ,但它们也都是阻塞的,所以 mainloop.run() 不会被执行。

有什么建议么?

Hou*_*eng 7

您可以使用 glib 的 g_timeout_add_seconds 函数来注册要在 GMainloop 上下文中执行的回调函数。在Python中,这个函数被封装在GObject中,你可以尝试下面的示例代码:

from gi.repository import GObject

def hello():
   print("Hello world!\n")
   return True

GObject.timeout_add_seconds(1, hello)
loop = GObject.MainLoop()
loop.run()
Run Code Online (Sandbox Code Playgroud)

  • 在实现这个时,我犯了一个错误,遗漏了“return True”。从文档中可以看出:“该函数会被重复调用,直到返回 false,此时超时会自动销毁,并且该函数不会再次被调用。” (4认同)