我正在尝试创建一个“保持活动”的 websocket 线程,一旦有人连接到该页面,每 10 秒向浏览器发送一次发射,但我收到错误,并且不确定如何解决它。
关于如何实现这项工作有什么想法吗?
一旦发送“断开连接”,我将如何终止该线程?
Thanks!
@socketio.on('connect', namespace='/endpoint')
def test_connect():
emit('my response', {'data': '<br>Client thinks i\'m connected'})
def background_thread():
"""Example of how to send server generated events to clients."""
count = 0
while True:
time.sleep(10)
count += 1
emit('my response', {'data': 'websocket is keeping alive'}, namespace='/endpoint')
global thread
if thread is None:
thread = Thread(target=background_thread)
thread.start()
您编写后台线程的方式要求它知道谁是客户端,因为您要向它发送直接消息。因此,后台线程需要访问请求上下文。在 Flask 中,您可以使用以下命令在线程中安装当前请求上下文的副本copy_current_request_context
装饰器:
@copy_current_request_context
def background_thread():
"""Example of how to send server generated events to clients."""
count = 0
while True:
time.sleep(10)
count += 1
emit('my response', {'data': 'websocket is keeping alive'}, namespace='/endpoint')
几点注意事项:
- 发送回客户端时不需要设置命名空间,默认情况下
emit
调用将在客户端使用的同一命名空间上进行。当您在请求上下文之外广播或发送消息时,需要指定命名空间。
- 请记住,您的设计将需要为每个连接的客户端提供单独的线程。如果有一个向所有客户端广播的后台线程,效率会更高。请参阅我在 Github 存储库上的示例应用程序作为示例:https://github.com/miguelgrinberg/Flask-SocketIO/tree/master/example
要在客户端断开连接时停止线程,您可以使用任何多线程机制来让线程知道它需要退出。例如,这可以是您在断开连接事件上设置的全局变量。一个不太好但易于实施的替代方案是等待emit
当客户端离开时引发异常并使用它退出线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)