我正在尝试创建一个'keepalive'websocket线程,以便在有人连接到该页面后每10秒向浏览器发送一次发射,但是我遇到了一个错误,并且不确定如何解决。
关于如何进行这项工作的任何想法?
一旦发送“断开连接”后,我将如何杀死该线程?
谢谢!
@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
调用将位于客户端使用的相同名称空间上。在请求上下文之外广播或发送消息时,需要指定名称空间。要在客户端断开连接时停止线程,您可以使用任何多线程机制来让线程知道它需要退出。例如,这可以是您在断开连接事件上设置的全局变量。一个不太容易实现的替代方法是,当客户端离开时,等待emit
引发异常并使用该异常退出线程。