2016-09-30 169 views
0

我正在玩zeromq酒吧/子消息发送到浏览器与WebSocket。下面的“作品”中,通过websocket发送消息。然而,试图重新加载页面只是挂起,因为我猜while True循环被阻止。我认为gevent.sleep()调用将允许上下文切换,但显然不是。任何想法如何让所有这些部分一起工作?瓶颈和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() 

回答