首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >flask和flask-socketio刷新所有发出事件

flask和flask-socketio刷新所有发出事件
EN

Stack Overflow用户
提问于 2015-09-22 23:16:10
回答 2查看 2.5K关注 0票数 5

如何刷新flask-socketio emit事件,使多行流到客户端,而不是一次通过多行?

我正在与Flask和flask-socketIO合作制作一个web应用程序,让用户可以与开源国际象棋AI对战,比如gnuchess和crafty。国际象棋AI将他们的“思维”作为stdout打印到服务器端,但我使用flask-socketIO将这种思维传递给用户。

这一切都是设置和工作的,但我的问题是,每一行的思考都是在一个大块中进行的,而不是在AI打印出来的时候输出每一行。

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

代码语言:javascript
复制
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显示给客户端,如下所示:

代码语言:javascript
复制
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...

相关代码如下:

代码语言:javascript
复制
@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)

这里的问题是,在flask路由返回后,所有的socketio.emit事件都会作为一个大的文本块出现。也许他们被困在缓冲区里了?有没有办法把他们赶走?

“打印"AI的想法是:”当AI输出文本时,+行代码会将多行文本流到服务器,一次一行。但是,socketio.emit代码一次都会传到客户端,而不是逐行流出。

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2018-03-05 15:39:24

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

代码语言:javascript
复制
from .. import socketio

然后使用

代码语言:javascript
复制
socketio.sleep(0)

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

代码语言:javascript
复制
def send_status(data):
    emit('status', data, json=True)
    socketio.sleep(0)

使用我想作为JSON发送的字符串调用它

代码语言:javascript
复制
elehelper.send_status({'code': 201, 'message': 'Jana\'s skull stripper started!'})
票数 5
EN

Stack Overflow用户

发布于 2016-03-25 00:07:11

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

当然,您必须使用import eventlet

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32720668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档