Python 使用socket.io显示实时数据

Python 使用socket.io显示实时数据,python,flask,socket.io,flask-socketio,Python,Flask,Socket.io,Flask Socketio,我有一个.csv文件。csv文件中的每一行都包含文本和日期字段(也按日期排序)。通过迭代csv文件,我们计算每个日期的词频,并将词频发送到客户端,并使用html显示它们 我使用的是Python3、Flask和Flask SocketIO,但是只显示最后日期的单词频率。可以在中查看调试信息。从调试信息来看,在迭代结束之前,SocketIO似乎一直在客户端发送事件而不接收任何数据。我想要的是在迭代过程中发送和接收每个数据,以便在客户端实时更新词频。我在使用SocketIO时做错什么了吗 谢谢你的建议

我有一个.csv文件。csv文件中的每一行都包含文本和日期字段(也按日期排序)。通过迭代csv文件,我们计算每个日期的词频,并将词频发送到客户端,并使用html显示它们

我使用的是Python3、Flask和Flask SocketIO,但是只显示最后日期的单词频率。可以在中查看调试信息。从调试信息来看,在迭代结束之前,SocketIO似乎一直在客户端发送事件而不接收任何数据。我想要的是在迭代过程中发送和接收每个数据,以便在客户端实时更新词频。我在使用SocketIO时做错什么了吗

谢谢你的建议

对于JavaScript:

$(document).ready(function(){
    //connect to the socket server.
    var socket = io.connect('http://' + document.domain + ':' +     location.port + '/test');

    //receive details from server
    socket.on('connect', function() {
        socket.emit('my_event', {data: 'I\'m connected!'});
    });

    socket.on('new_count', function(msg) {
        console.log("Received count");
        //get data
        var tags = msg.data;
        console.log(tags[0].key);
        numbers_string = '';
        for (var i = 0; i < tags.length; i++){
            numbers_string = numbers_string + '<p>' + tags[i].key + ': ' +    tags[i].value + '</p>';
        }
        $('#vis').html(numbers_string);
        socket.emit("my_event", {data: "one update received!"});
    });
});

这个答案假设您正在使用eventlet或gevent,它们实现协作多任务

emit()
调用是异步工作的,这意味着在eventlet或gevent下,如果希望CPU立即被相应的后台线程处理,则需要释放CPU


这实际上非常简单,只需在
emit()
之后添加一个
socketio.sleep(0)
。如果您发现这对性能影响太大,可以选择每隔一次或更多次循环迭代休眠一次。基本上,您需要找到正确的平衡。

使用此代码,Flask将在短时间内在CVS中每行发出一条消息。在JavaScript端,您正在更新每个mesage的HTML,覆盖以前的更新。因此,您将只看到最后一条消息的更改。谢谢!我发现将scoketio.sleep()放在emit()之前对我有效!我不知道为什么,如果将它放在emit()之后,它就不起作用了。
day=""
@socketio.on('connect', namespace="/test")
def test_connect():
    global day
    print("clinet connected")
    with open("static/sorted_examples.csv", 'r') as f:
        reader = csv.DictReader(f)
        day = ""
        words = []
        for row in reader:
            text = row['text']
            date_day = row['date_day']
            words += text.split()
            if date_day != day:
                day = date_day
                word_count = Counter(words).most_common(20)
                words[:] = []
                emit_data = [dict([("key", k), ("value", v)]) for k, v in word_count]
                socketio.emit('new_count', {"data": emit_data}, namespace='/test')