2016-01-21 27 views
0

嘿,我打算讓我的網絡服務器與dbus信號接收工作。該webserver與gevent.WSGIServer一起運行,因爲我需要websocket的支持,而dbus是通過python-dbus包處理的。如何在網絡服務器永久運行時接收dbus信號?

的問題是:

  1. 網絡服務器總是有一個事件循環運行下去,然而, 接收DBUS信號,蟒-DBUS需要另一個事件循環(這是 主循環)來運行永遠爲好。
  2. 我不能讓網絡服務器運行,同時保持偵聽 到dbus信號。

這裏是我的代碼:

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() 

回答

0

您可以運行在另一個線程的主迴路中的一個。

+0

雖然你沒有拒絕對問題的評論,但它不是一種很好的表達方式。最好等到你有適當的評論聲望 – Nehal

相關問題