Tôi bắt đầu với DBus và lập trình hướng sự kiện nói chung. Các dịch vụ mà tôi đang cố gắng để tạo ra thực sự bao gồm ba phần nhưng hai thực sự là "máy chủ" điều.Dbus/GLib Vòng lặp chính, Chủ đề nền
1) Máy chủ DBus thực tế trao đổi với một trang web từ xa qua HTTPS, quản lý phiên và truyền tải thông tin cho khách hàng.
2) Các phần khác của dịch vụ gọi là giữ cho trang sống mỗi 2 phút để giữ phiên hoạt động trên các trang web bên ngoài
3) Khách hàng thực hiện cuộc gọi đến các dịch vụ để lấy thông tin từ các dịch vụ.
Tôi đã tìm thấy một số chương trình ví dụ đơn giản. Tôi đang cố gắng để thích nghi chúng với nguyên mẫu # 1 và # 2. Thay vì xây dựng các chương trình riêng biệt cho cả hai. Tôi nghĩ rằng tôi có thể chạy chúng trong một quá trình hai luồng.
Vấn đề mà tôi thấy là tôi gọi time.sleep (X) trong chuỗi tiếp tục còn sống. Chủ đề đi ngủ, nhưng sẽ không bao giờ thức dậy. Tôi nghĩ rằng GIL không được phát hành bởi vòng lặp chính GLib.
Đây là mã đề của tôi:
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')
Từ các báo cáo in, tôi biết rằng giấc ngủ bắt đầu, nhưng tôi không bao giờ thấy "giấc ngủ thực hiện."
Đây là mã chính:
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()
Một số quan sát khác:
tôi thấy "bắt đầu vòng lặp chính" tin nhắn, vì vậy tôi biết nó nhận được kiểm soát. Sau đó, tôi thấy "giấc ngủ% i", và sau đó, không có gì.
Nếu tôi^C, sau đó tôi thấy "ngủ xong". Sau ~ 20 giây, tôi có ngoại lệ từ self.run() mà ứng dụng từ xa không phản hồi:
DBusException: org.freedesktop.DBus.Error.NoReply: Không nhận được trả lời. Các nguyên nhân có thể bao gồm: ứng dụng từ xa không gửi trả lời, chính sách bảo mật của bus tin nhắn đã chặn trả lời, thời gian chờ trả lời hết hạn hoặc kết nối mạng bị hỏng.
Cách tốt nhất để chạy mã tiếp tục của tôi trong máy chủ là gì?
Cảm ơn,
Jro, Cảm ơn bạn đã đề xuất. Tôi mới đến điều này và thực sự không hiểu mối quan hệ giữa dbus/glib/gtk/gobject. tomeout_add() là chính xác những gì tôi muốn. – fandingo