puerto serie de lectura de pyserial en el matraz (tal vez utilizando gevent)

Estoy construyendo un servidor web que necesitaría leer (y seguir leyendo) el puerto serie de la máquina en la que se está ejecutando.
El propósito es poder leer un escáner de código de barras y usar eventos enviados por el servidor para actualizar un navegador con el código de barras de lectura.

Estoy usando el matraz para hacer esto. He explorado y algunas implementaciones requieren solo un matraz, algunos dicen que necesitaría una biblioteca asíncrona como Gevent, y otros incluso dicen que necesitaría Gevent y algún tipo de cola como Redis o RabbitMQ.

He intentado basar mi código en un ejemplo muy simple que encontré en stackoverflowaquí. Lo tengo casi todo funcionando, pero estoy atascado con algunas preguntas;

En Chrome hay un error de origen cruzado, al agregar un encabezado de Access-Control-Allow-Origin puedo hacer que funcione en Firefox, pero Chrome todavía no funciona. ¿Es correcto que solo FF admita el origen cruzado de SSE? Lo necesito para admitir CORS porque el navegador necesitará cargar los datos del código de barras desde una máquina separada.Después de cada mensaje, el navegador muestra el código de barras en la consola, pero luego cierra la conexión y solo la abre nuevamente después de unos 3 segundos. Parece que esto se origina en Flask, me da los datos y luego simplemente se detiene.Además, me pregunto cómo funcionará esto bajo carga. Quiero decir, Flask mantiene una conexión abierta para el mimetype text / event-stream. Si se conectan varios clientes, ¿no bloqueará el matraz después de un tiempo, porque todas las conexiones se saturarán?

Mi código es el siguiente (acortado para mayor claridad)

Lado del servidor:

from flask import Flask
import flask
import serial

app = Flask(__name__)
app.debug = True

def event_barcode():
    ser = serial.Serial()
    ser.port = 0
    ser.baudrate = 9600
    ser.bytesize = 8
    ser.parity = serial.PARITY_NONE
    ser.stopbits = serial.STOPBITS_ONE
    ser.open()
    s = ser.read(7)
    yield 'data: %s\n\n' % s

@app.route('/barcode')
def barcode():
    newresponse = flask.Response(event_barcode(), mimetype="text/event-stream")
    newresponse.headers.add('Access-Control-Allow-Origin', '*')
    return newresponse

if __name__ == '__main__':
    app.run(port=8080, threaded=True)

Lado del cliente:

    <!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv=Content-Type content="text/html; charset=utf-8">
    <title>TEST</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" type="text/javascript" charset="utf-8"></script>
    <script>

        $(document).ready(function(){
            if (!!window.EventSource) {
                console.log('SSE supported.');
                var source = new EventSource('http://localhost:8080/barcode');

                source.addEventListener('message', function(e) {
                  console.log(e.data);
                }, false);

                source.addEventListener('open', function(e) {
                  console.log('Connection was opened.');
                }, false);

                source.addEventListener('error', function(e) {
                  if (e.readyState == EventSource.CLOSED) {
                    console.log('Connection was closed.');
                  }
                }, false);

            } else {
                console.log('SSE notsupported.');
            }
        });

    </script>
</head>

<body>

</body>
</html>

Hay algo más de información que estaba viendo aquí:http://www.socketubs.net/2012/10/28/Websocket_with_flask_and_gevent/ http://sdiehl.github.com/gevent-tutorial/#chat-server

Espero que alguien pueda aclarar mis preguntas, y tal vez me señale algunas soluciones, para el problema de origen cruzado y el retraso de 3 segundos.

Gracias.

Respuestas a la pregunta(2)

Su respuesta a la pregunta