Я начинаю с DBus и программированием на основе событий в целом. Сервис, который я пытаюсь создать, на самом деле состоит из трех частей, но две действительно "серверные" вещи.
1) Фактический сервер DBus общается с удаленным веб-сайтом по протоколу HTTPS, управляет сеансами и передает информацию клиентам.
2) Другая часть службы вызывает страницу поддержания активности каждые 2 минуты для поддержания активности сеанса на внешнем веб-сайте
3) Клиенты совершают звонки в службу для получения информации из службы.
Я нашел несколько простых примеров программ. Я пытаюсь адаптировать их к прототипу № 1 и № 2. Вместо того, чтобы создавать отдельные программы для обоих. Я думал, что смогу запустить их в один, двухпоточный процесс.
Проблема, с которой я сталкиваюсь, заключается в том, что я вызываю time.sleep (X) в моей ветке поддержки активности. Нить идет спать, но никогда не проснется. Я думаю, что GIL не выпускается основным циклом GLib.
Вот мой код темы:
class Keepalive(threading.Thread):
def __init__(self, interval=60):
super(Keepalive, self).__init__()
self.interval = interval
bus = dbus.SessionBus()
self.remote = bus.get_object("com.example.SampleService", "/SomeObject")
def run(self):
while True:
print('sleep %i' % self.interval)
time.sleep(self.interval)
print('sleep done')
reply_status = self.remote.keepalive()
if reply_status:
print('Keepalive: Success')
else:
print('Keepalive: Failure')
Из утверждений в печати я знаю, что сон начинается, но я никогда не вижу "сон сделан".
Вот основной код:
if __name__ == '__main__':
try:
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
session_bus = dbus.SessionBus()
name = dbus.service.BusName("com.example.SampleService", session_bus)
object = SomeObject(session_bus, '/SomeObject')
mainloop = gobject.MainLoop()
ka = Keepalive(15)
ka.start()
print('Begin main loop')
mainloop.run()
except Exception as e:
print(e)
finally:
ka.join()
Некоторые другие наблюдения:
Я вижу сообщение "начать основной цикл", поэтому я знаю, что оно получает контроль. Затем я вижу "sleep% i", а после этого ничего.
Если я ^ C, тогда я вижу "сон сделан". Через ~ 20 секунд я получаю исключение из self.run (), что удаленное приложение не отвечает:
DBusException: org.freedesktop.DBus.Error.NoReply: Не получил ответ. Возможные причины: удаленное приложение не отправило ответ, политика безопасности шины сообщений заблокировала ответ, истекло время ожидания ответа или было разорвано сетевое соединение.
Какой лучший способ запустить мой код поддержки активности на сервере?
Спасибо