Flask和Flask -socketio flush都会发出事件



如何刷新flask-socketio emit事件,以便多行流到客户端,而不是多行同时通过?

我正在与Flask和Flask - socketio合作,制作一个web应用程序,让用户与开源的国际象棋AI下棋,如gnuchess和crafty。象棋AI将他们的"想法"作为标准输出打印到服务器终端,但我使用flask-socketIO将这些想法发送给用户。

这都是设置和工作,但我的问题是,每一行的想法都是通过一个大块,而不是输出每一个单独的行作为AI打印它。

例如,当与gnuchess对战时,服务器打印出这样的想法:

AI thinking: Thinking...
AI thinking: 1 +4 0 2 a5
AI thinking: 1 +9 0 4 b5
AI thinking: 1 +51 0 8 d5
AI thinking: 1 +53 0 21 Nc6
AI thinking: 2 -1 0 47 Nc6 Nc3
AI thinking: 3 +53 0 155 Nc6 Nc3 Nf6
AI thinking: 4 -1 0 613 Nc6 Nf3 Nf6 Nc3

这些行流到我的服务器。在客户端,我发出AI行,它们(现在)以ul的形式显示给客户端,如下所示:

4 -1 0 613 Nc6 Nf3 Nf6 Nc3
3 +53 0 155 Nc6 Nc3 Nf6
2 -1 0 47 Nc6 Nc3
1 +53 0 21 Nc6
1 +51 0 8 d5
1 +9 0 4 b5
1 +4 0 2 a5
Thinking...

相关代码如下:

@main.route('/getpythondata')
def get_python_data():
    # gets current proc by finding user's most recent game...
    current_game = get_current_game(current_user)
    current_proc = get_current_proc(current_game)
    line = current_proc.stdout.readline().rstrip()
    socketio.emit(
            'echo',
            {'echo': line})
    # for gnu chess
    if current_game.ai == "GNU chess":
        while ("My move is" not in line):
            socketio.emit(
                'echo',
                {'echo': line})
            print "AI thinking: " + line
            line = current_proc.stdout.readline().rstrip()
        colon_index = line.index(":")
        line_length = len(line)
        pythondata = line[(colon_index + 2):(line_length)]
        current_game.cpu_moves.append(pythondata)
        return json.dumps(pythondata)

这里的问题是所有的套接字。Emit事件在flask路由返回后作为一大块文本传递。也许他们被困在缓冲区里了?有办法把他们引出来吗?

"打印"AI思考:"+行代码流到服务器的多行文本,一行一行,就像AI输出它们一样。"但是,插座。Emit代码一次传递给客户端,而不是逐行输出。

任何想法?

socketio.emit()语句之后使用eventlet.sleep(0)

你当然得去import eventlet

来源: https://github.com/miguelgrinberg/Flask-SocketIO/issues/141

首先导入socketio对象(确保路径指向创建它的位置)

from .. import socketio

然后使用

socketio.sleep(0)

我创建了一个函数为我做睡眠:)

def send_status(data):
    emit('status', data, json=True)
    socketio.sleep(0)

用JSON发送的字符串调用

elehelper.send_status({'code': 201, 'message': 'Jana's skull stripper started!'})

相关内容

  • 没有找到相关文章