2016-09-30 10 views
0

私はzeromqのpub/subメッセージを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() 

答えて