我有一个基于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()
这将调用cb_udisk_dev_add和-rem回调函数。现在我想要一个定时回调函数,我喜欢每隔5分钟调用一次。
似乎mainloop.run()是一个阻塞函数,所以我想我需要在mainloop中添加一个类型的计时器......?
我尝试过实现一些定期执行的函数: Executing periodic actions in Python 但它们都是阻塞的,所以mainloop.run()不会被执行。
有什么建议吗?
答案 0 :(得分:1)
您可以使用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()