porta serial de leitura pyserial no frasco (talvez usando gevent)

Estou construindo um servidor que precisaria ler (e continuar lendo) a porta serial da máquina em que ele está sendo executado.
O objetivo é poder ler um scanner de código de barras e usar Eventos enviados pelo servidor para atualizar um navegador com o código de barras de leitura.

Estou usando um frasco para fazer isso. Eu tenho procurado e algumas implementações requerem apenas flask, alguns dizem que eu precisaria de uma biblioteca assíncrona como Gevent, e alguns outros até dizem que eu preciso de Gevent e algum tipo de fila como Redis ou RabbitMQ.

Eu tentei basear meu código em um exemplo muito simples que encontrei no stackoverflowAqui. Eu tenho isso funcionando principalmente, mas estou preso com algumas perguntas;

No Chrome, há um erro de origem cruzada, ao adicionar um cabeçalho Access-Control-Allow-Origin, posso fazê-lo funcionar no FireFox, mas o Chrome ainda não funciona. É correto que apenas o FF suporte a origem cruzada do SSE? Eu preciso disso para suportar o CORS porque o navegador precisará carregar os dados do código de barras de uma máquina separada.Depois de cada mensagem, o navegador mostra o código de barras no console, mas fecha a conexão e só a abre novamente após cerca de 3 segundos. Parece que isso se origina no Flask, me fornece os dados e depois simplesmente para.Além disso, estou me perguntando como isso vai funcionar sob carga. Quero dizer, o frasco mantém uma conexão aberta para o tipo MIME do fluxo de texto / evento. Se vários clientes se conectarem, ele não bloqueará o frasco depois de um tempo, porque todas as conexões estarão saturadas?

Meu código é o seguinte (encurtado para maior clareza)

Lado do 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 do 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>

Há mais algumas informações que eu estava vendo aqui:http://www.socketubs.net/2012/10/28/Websocket_with_flask_and_gevent/ http://sdiehl.github.com/gevent-tutorial/#chat-server

Espero que alguém possa esclarecer minhas dúvidas, e talvez me aponte para algumas soluções, para o problema da origem cruzada e do atraso de 3 segundos.

Obrigado.

questionAnswers(2)

yourAnswerToTheQuestion