我有一个使用bottle和gevent.wsgi实现的小型异步服务器。有用于实现长轮询,看起来很像在bottle documentation“事件回调”示例程序:使用bottle和gevent.wsgi响应客户端断开连接?
def worker(body):
msg = msgbus.recv()
body.put(msg)
body.put(StopIteration)
@route('/poll')
def poll():
body = gevent.queue.Queue()
worker = gevent.spawn(worker, body)
return body
这里,msgbus
是一个ZMQ sub
插座。
这一切工作正常,但如果客户端打破,而 worker
被封锁msgbus.recv()
,这greenlet任务将挂起 围绕连接“永远”(当然,直到收到消息),并且将只 发现当它尝试发送一个 响应时关于断开连接的客户端。
我可以使用msgbus.poll(timeout=something)
如果我不想阻止 永远在等待ipc消息,但我仍然无法检测到客户端 断开连接。
我想什么做的就是像给客户 插座的参考,这样我可以在某种select
或poll
循环, 使用它,或者获得某种我greenlet内异步通知,但 我不确定如何用这些 框架(瓶和gevent)完成这些任何一项。
有没有办法获得客户端断开连接的通知?