0

语境

我正在使用RxPY启用通过 websockets 发送基于推送的事件。我在带有geventFlask服务器中使用烧瓶套接字。events 类包含一个充当事件发布者的rx.subject.BehaviorSubject,而 websocket 客户端订阅更改。

问题

我希望能够检测到客户端何时断开连接,以便正确处理资源。问题是当套接字断开连接并ws.send引发异常但它在 lambda 内时。

解决方案?

有没有办法将异常传递给父函数?

另一种解决方案是在不调用的情况下检测 websocket 断开连接,并且可以在 lambda 之外进行检查,尽管我在烧瓶套接字库中ws.send找不到这种方法。

@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()
4

1 回答 1

1

我找到了一种解决方法,使用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

现在可以在方法返回None套接字断开事件时释放资源。

于 2019-12-17T16:18:58.490 回答