我在我的本地计算机上运行Flask服务器并使用它从串行端口提取数据并使用Flask-socketio在网页上实时显示。我按照示例here进行了一次有趣的行为。我能够复制示例的结果,但是当我改变background_thread函数以包括从串行端口读取和解析数据时,似乎阻止了套接字发送数据。我的代码正确地建立了一个套接字并打开了连接,甚至可以在线程函数的开头正确地发出消息,但是一旦它到达time.sleep(5),发出就不再工作了。这是原始的线程函数(包括time.sleep()!):
def background_thread():
"""Example of how to send server generated events to clients."""
count = 0
while True:
time.sleep(1)
count += 1
socketio.emit('my response',
{'data': 'Server generated event', 'count': count},
namespace='/test')
这是我的代码中的一个剪辑。我使用延迟等待我的串行设备完成操作,然后再次读取它。
socketio.emit('my response', {'data': 'waiting'}, namespace='/test')
print( "waiting...", file=sys.stderr)
time.sleep(5)
socketio.emit('my response', {'data': 'done sleeping'}, namespace='/test')
在这种情况下,我看到"等待"消息,但不是"完成睡眠"消息或之后的任何其他消息。没有错误,代码保持正常运行。但是,当我按下ctrl + c来杀死脚本时,突然在浏览器端出现time.sleep()后我尝试发出的所有消息。它就像阻塞和缓冲所有消息然后在脚本被杀死时将它们转储一样。我还试着看看时间是否有问题,并尝试了这个:
socketio.emit('my response', {'data': 'waiting'}, namespace='/test')
print( "waiting...", file=sys.stderr)
socketio.emit('my response', {'data': 'about to sleep'}, namespace='/test')
time.sleep(1)
socketio.emit('my response', {'data': 'sleep 1'}, namespace='/test')
time.sleep(1)
socketio.emit('my response', {'data': 'sleep 2'}, namespace='/test')
time.sleep(1)
socketio.emit('my response', {'data': 'sleep 3'}, namespace='/test')
time.sleep(1)
socketio.emit('my response', {'data': 'sleep 4'}, namespace='/test')
time.sleep(1)
socketio.emit('my response', {'data': 'done sleeping'}, namespace='/test')
在这种情况下,我看到了#4;睡眠4"消息,但之后什么都没有。更改睡眠语句的数量总是导致它在最后一次睡眠后没有发出任何内容。为了增加这个谜团,如果我完全删除睡眠陈述,我根本看不到从线程中发出的任何东西。
我使用Flask-socketio版本1.4.5和eventlet作为异步服务。我尝试用eventlet.sleep()替换time.sleep(),但看到了相同的行为。