使用 RxPY 处理基于推送的事件的 Python Flask 服务器中的 websocket 断开连接
Handling websocket disconnect in Python Flask server using RxPY for push based events
上下文
我正在使用 RxPY 来启用通过 websockets 发送基于推送的事件。我在带有 gevent 的 Flask 服务器中使用 flask-sockets。事件 class 包含充当事件发布者的 rx.subject.BehaviorSubject,而 websocket 客户端订阅更改。
问题
我希望能够检测到客户端何时断开连接,以便我可以正确处理资源。问题是当套接字断开连接并且 ws.send
抛出异常但它在 lambda 内部。
解决方案?
有没有办法将异常传递给父函数?
另一种解决方案是在不调用 ws.send
的情况下检测 websocket 断开连接,这可以在 lambda 之外进行检查,尽管我在 flask-sockets图书馆。
@sockets.route('/ws/events')
def wsEvents(ws):
sub = None
disp = None
try:
print("socket opened")
def update_fn(x):
print(x)
ws.send(json.dumps(x))
sub = events.get_sub(None)
if sub is not None:
disp = sub.subscribe(lambda x: update_fn(x))
else:
raise Exception('Undefined sub')
while not ws.closed:
gevent.sleep(1)
pass
except Exception as e:
print(e)
finally:
print("socket closed")
if disp is not None:
disp.dispose()
我找到了一个解决方法,使用 gevent 超时方法检测套接字断开连接事件,如下所示:
while not ws.closed:
gevent.sleep(0.1)
try:
data = gevent.with_timeout(0.1, ws.receive, timeout_value="")
if data is None:
raise Exception("socket closed")
except:
break
现在可以在套接字断开事件上将资源作为方法 returns None
处理。
上下文
我正在使用 RxPY 来启用通过 websockets 发送基于推送的事件。我在带有 gevent 的 Flask 服务器中使用 flask-sockets。事件 class 包含充当事件发布者的 rx.subject.BehaviorSubject,而 websocket 客户端订阅更改。
问题
我希望能够检测到客户端何时断开连接,以便我可以正确处理资源。问题是当套接字断开连接并且 ws.send
抛出异常但它在 lambda 内部。
解决方案?
有没有办法将异常传递给父函数?
另一种解决方案是在不调用 ws.send
的情况下检测 websocket 断开连接,这可以在 lambda 之外进行检查,尽管我在 flask-sockets图书馆。
@sockets.route('/ws/events')
def wsEvents(ws):
sub = None
disp = None
try:
print("socket opened")
def update_fn(x):
print(x)
ws.send(json.dumps(x))
sub = events.get_sub(None)
if sub is not None:
disp = sub.subscribe(lambda x: update_fn(x))
else:
raise Exception('Undefined sub')
while not ws.closed:
gevent.sleep(1)
pass
except Exception as e:
print(e)
finally:
print("socket closed")
if disp is not None:
disp.dispose()
我找到了一个解决方法,使用 gevent 超时方法检测套接字断开连接事件,如下所示:
while not ws.closed:
gevent.sleep(0.1)
try:
data = gevent.with_timeout(0.1, ws.receive, timeout_value="")
if data is None:
raise Exception("socket closed")
except:
break
现在可以在套接字断开事件上将资源作为方法 returns None
处理。