2011-10-12 25 views
6

私は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から例外を取得します。リモートアプリケーションが応答を送信しなかった、メッセージバスのセキュリティポリシーが応答をブロックした、応答タイムアウトが切れた、またはネットワーク接続が切断されたなどの原因が考えられます。

サーバー内でキープアライブコードを実行するにはどうすればよいですか?

おかげで、

答えて

6

あなたはgobjectを使用するときに、明示的にgobject.threads_init()を呼び出すことにより、マルチスレッドを有効にする必要があります。背景情報については、PyGTK FAQを参照してください。

次に、説明する目的でタイムアウトが適しているようです。次のように使用します。

# Enable timer 
self.timer = gobject.timeout_add(time_in_ms, self.remote.keepalive) 
# Disable timer 
gobject.source_remove(self.timer) 

これは、すべてのtime_in_ms(ミリ)秒keepalive関数を呼び出します。再度の詳細は、PyGTK referenceで見つけることができます。

+0

Jro、ありがとうございます。私はこれを初めて知り、実際にdbus/glib/gtk/gobjectの関係を理解し​​ていませんでした。 tomeout_add()は私が欲しいものです。 – fandingo

関連する問題