如何冲洗flask-socketio emit事件,以便多条线路流向客户端,而不是多条线路同时传输?
我正在使用Flask和flask-socketIO制作一个网络应用程序,让用户下棋对抗开源象棋AI,如gnuchess和crafty。国际象棋AI将它们的“思考”打印为stdout到服务器终端,但我正在使用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)
这里的问题是所有socketio.emit事件在烧瓶路径返回后作为一大块文本传来。也许他们被困在缓冲区?有没有办法冲洗它们?
“打印”AI思维:“+行代码流向服务器多行文本,一次一行,正如AI输出它们。但是,socketio.emit代码全部通过客户端,而不是逐行流出。
有什么想法吗?
答案 0 :(得分:3)
在eventlet.sleep(0)
声明之后使用socketio.emit()
。
当然,您必须import eventlet
。
来源: https://github.com/miguelgrinberg/Flask-SocketIO/issues/141
答案 1 :(得分:2)
首先导入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!'})