Python 使用瓶子和gevent.wsgi响应客户端断开连接?
我使用和实现了一个小型异步服务器。有一个用于实现长轮询的例程,它与中的“事件回调”示例非常相似: 这里,Python 使用瓶子和gevent.wsgi响应客户端断开连接?,python,wsgi,bottle,gevent,Python,Wsgi,Bottle,Gevent,我使用和实现了一个小型异步服务器。有一个用于实现长轮询的例程,它与中的“事件回调”示例非常相似: 这里,msgbus是一个ZMQsubsocket 这一切都很好,但如果客户端在 msgbus.recv()上的worker被阻止,该greenlet任务将挂起 大约是“永远”(好吧,直到收到一条信息),并且只会 当断开连接的客户端尝试发送消息时,了解该客户端的情况 答复 如果我不想阻止,我可以使用msgbus.poll(timeout=something) 一直在等待ipc消息,但我仍然无法检测到客
msgbus
是一个ZMQsub
socket
这一切都很好,但如果客户端在
msgbus.recv()
上的worker
被阻止,该greenlet任务将挂起
大约是“永远”(好吧,直到收到一条信息),并且只会
当断开连接的客户端尝试发送消息时,了解该客户端的情况
答复
如果我不想阻止,我可以使用msgbus.poll(timeout=something)
一直在等待ipc消息,但我仍然无法检测到客户端
断开
我想做的是得到一个客户的参考
套接字,以便我可以在某种select
或poll
循环中使用它,
或者在我的greenlet中获得某种异步通知,但是
我不知道如何用这些来完成这两件事
框架(瓶子和gevent)
有没有办法得到客户端断开连接的通知?啊哈!
wsgi.input
变量,至少在gevent.wsgi
下,有一个rfile
成员,是一个类似文件的对象。这似乎不是所需的,因此可能无法与其他服务器一起使用
有了它,我可以修改代码,使其看起来像:
def worker(body, rfile):
poll = zmq.Poller()
poll.register(msgbus)
poll.register(rfile, zmq.POLLIN)
while True:
events = dict(poll.poll())
if rfile.fileno() in events:
# client disconnect!
break
if msgbus in events:
msg = msgbus.recv()
body.put(msg)
break
body.put(StopIteration)
@route('/poll')
def poll():
rfile = bottle.request.environ['wsgi.input'].rfile
body = gevent.queue.Queue()
worker = gevent.spawn(worker, body, rfile)
return body
这很有效
…除了在上,您必须使用
在支持websockets的端口8000上
def worker(body, rfile):
poll = zmq.Poller()
poll.register(msgbus)
poll.register(rfile, zmq.POLLIN)
while True:
events = dict(poll.poll())
if rfile.fileno() in events:
# client disconnect!
break
if msgbus in events:
msg = msgbus.recv()
body.put(msg)
break
body.put(StopIteration)
@route('/poll')
def poll():
rfile = bottle.request.environ['wsgi.input'].rfile
body = gevent.queue.Queue()
worker = gevent.spawn(worker, body, rfile)
return body