私はDBusとイベント駆動型プログラミングから一般的に始まります。私が作成しようとしているサービスは、実際には3つの部分で構成されていますが、2つは実際には「サーバー」なものです。Dbus/GLibメインループ、バックグラウンドスレッド
1)実際のDBusサーバーは、HTTPS経由でリモートWebサイトと通信し、セッションを管理し、クライアントに情報を伝えます。
2)サービスの他の部分は、クライアントがサービスから情報を取得するために、サービスへの呼び出しを行う)
3外部のウェブサイト上でアクティブなセッションを維持するために生きているページごとに2分を維持呼び出します。
私はいくつかの簡単なサンプルプログラムを見つけました。プロトタイプ#1と#2にそれらを適用しようとしています。両方のために別々のプログラムを構築するよりもむしろ。私は、私はそれらを単一の2つのスレッドプロセスで実行できると思った。
私が見ている問題は、私がkeep aliveスレッドでtime.sleep(X)を呼び出すことです。スレッドはスリープ状態になりますが、起きることはありません。私はGILがGLibメインループによって解放されていないと思う。
はここに私のスレッドコードです:print文から
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()
いくつかの他の観察:
は、ここでの主なコードです
私は「メインループを開始します」のメッセージを参照してくださいので、私はそれが制御を取得しています知っています。その後、私は "睡眠%i"を参照し、その後、何も。
I^Cの場合、「眠っている」と表示されます。
DBusException:org.freedesktop.DBus.Error.NoReply:応答を受信しませんでしたが〜20秒後に、私は、リモート・アプリケーションが応答しなかったこと)(self.runから例外を取得します。リモートアプリケーションが応答を送信しなかった、メッセージバスのセキュリティポリシーが応答をブロックした、応答タイムアウトが切れた、またはネットワーク接続が切断されたなどの原因が考えられます。
サーバー内でキープアライブコードを実行するにはどうすればよいですか?
おかげで、
Jro、ありがとうございます。私はこれを初めて知り、実際にdbus/glib/gtk/gobjectの関係を理解していませんでした。 tomeout_add()は私が欲しいものです。 – fandingo