擅长:python、mysql、java
<p>啊哈!至少在<code>gevent.wsgi</code>下,<code>wsgi.input</code>变量有一个<code>rfile</code>成员,它是一个类似文件的对象。这似乎不是<a href="http://www.python.org/dev/peps/pep-0333/#environ-variables" rel="nofollow">WSGI spec</a>所必需的,因此它可能无法与其他服务器一起工作。在</p>
<p>通过这个,我可以修改我的代码,使其看起来像:</p>
<pre><code>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
</code></pre>
<p>这个很好用。。。在</p>
<p>…除了在<a href="http://www.openshift.com/" rel="nofollow">OpenShift</a>上,您必须使用
<a href="https://www.openshift.com/blogs/paas-websockets" rel="nofollow">alternate frontend</a>在支持websockets的8000端口上。在</p>