Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用瓶子和gevent.wsgi响应客户端断开连接?_Python_Wsgi_Bottle_Gevent - Fatal编程技术网

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
是一个ZMQ
sub
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