2016-09-30 8 views
0

Ich spiele mit bekommen zeromq pub/sub-Nachrichten an einen Browser mit einem Websocket gesendet. Das Folgende funktioniert, indem Nachrichten über einen Websocket gesendet werden. Wie auch immer, der Versuch, die Seite neu zu laden, hängt einfach, da ich vermute, dass die while True Schleife blockiert. Ich dachte, dass der gevent.sleep() Anruf einen Kontextwechsel erlauben würde, aber anscheinend nicht. Irgendeine Idee, wie man all diese Teile zusammenarbeitet?flaschen-sockets und ZeroMQ

import zmq 
import json 
import gevent 
from flask_sockets import Sockets 
from flask import Flask, render_template 
import logging 
from gevent import monkey 

monkey.patch_all() 

app = Flask(__name__) 
logging.basicConfig(level=logging.INFO) 
logger = logging.getLogger(__name__) 

sockets = Sockets(app) 
context = zmq.Context() 

ZMQ_LISTENING_PORT = 6557 

@app.route('/') 
def index(): 
    return render_template('index.html') 

@sockets.route('/zeromq') 
def send_data(ws): 
    logger.info('Got a websocket connection, sending up data from zmq') 
    socket = context.socket(zmq.SUB) 
    socket.connect('tcp://localhost:{PORT}'.format(PORT=ZMQ_LISTENING_PORT)) 
    socket.setsockopt(zmq.SUBSCRIBE, "") 
    gevent.sleep() 
    while True: 
     data = socket.recv_json() 
     logger.info(data) 
     ws.send(json.dumps(data)) 
     gevent.sleep() 

if __name__ == '__main__': 
    from gevent import pywsgi 
    from geventwebsocket.handler import WebSocketHandler 
    server = pywsgi.WSGIServer(('', 25000), app, handler_class=WebSocketHandler) 
    server.serve_forever() 

Antwort