gpt4 book ai didi

python - flask 和 flask-socketio flush all emit 事件

转载 作者:太空狗 更新时间:2023-10-30 02:10:00 24 4
gpt4 key购买 nike

您如何刷新 flask-socketio 发出事件,以便多行流向客户端,而不是一次通过多行?

我正在使用 Flask 和 flask-socketIO 制作一个网络应用程序,让用户可以与开源国际象棋 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)

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

"print "AI thinking:"+ 行代码将多行文本流式传输到服务器,一次一行,就在 AI 输出它们时。但是,socketio.emit 代码全部通过一次到客户端,而不是逐行流出。

有什么想法吗?

最佳答案

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

当然,您必须import eventlet

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

关于python - flask 和 flask-socketio flush all emit 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32720668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com