嘿,伙计们,我正计划让我的网络服务器与dbus信号接收工作。Web服务器使用gevent.WSGIServer因为我需要websocket的支持,而dbus是通过python dbus包来处理的。
问题是:Web服务器总是有一个永远运行的事件循环,但是
接收dbus信号时,python dbus需要另一个事件循环(它
是mainloop)永远运行。在
我无法在保持窥探的同时运行Web服务器
至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()