如果网络服务器永远运行,如何接收dbus信号?

时间:2016-01-21 00:39:23

标签: python webserver dbus

嘿伙计们我打算让我的网络服务器与dbus信号接收一起工作。 webserver与gevent.WSGIServer一起运行,因为我需要websocket的支持,而dbus是通过python-dbus包处理的。

问题是:

  1. webserver总是有一个永远运行的事件循环,但是 接收dbus信号,python-dbus需要另一个事件循环(其中 是mainloop)也是永远运行。
  2. 我无法在保持窥探的同时让网络服务器运行 dbus信号。
  3. 以下是我的代码:

    if __name__ == '__main__':
        log = logging.getLogger('Rocket.Errors')
        log.setLevel(logging.INFO)
        log.addHandler(logging.StreamHandler(sys.stdout))
    
        dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
        bus = dbus.SystemBus()
        app = Bottle()
    
        # Register the dbus recieve handler
        #bus.add_signal_receiver(hostHeartBeatSignal)
        bus.add_signal_receiver(testSignal)
    
        **This will block the webserver from running!!!!!!!!**
        mainloop = gobject.MainLoop()
        mainloop.run()
    
        @app.route('/websocket', skip = True)
        def handle_websocket():
            print "Entering websocket handling"
            wsock = request.environ.get('wsgi.websocket')
            if not wsock:
                abort(400, 'Expected WebSocket request.')
            while True:
                try:
                    message = wsock.receive()
                    print "Message received"
                    wsock.send("Your message was: %r" % message)
                    print "Message sent"
                except WebSocketError:
                    break
    
    
        default_cert = os.path.join(sys.prefix, 'share',
                        os.path.basename(__file__), 'cert.pem')
    
        from gevent.pywsgi import WSGIServer
        from geventwebsocket import WebSocketError
        from geventwebsocket.handler import WebSocketHandler
    
        server = WSGIServer(("0.0.0.0", 443), app, keyfile = default_cert,
                            certfile = default_cert,
                             handler_class=WebSocketHandler)
        server.serve_forever()
    

1 个答案:

答案 0 :(得分:0)

您可以在另一个线程中运行其中一个主循环。