<p>从字面上回答你的问题,就是说你不能用樱桃皮和高速公路。CherryPy的正常请求处理是同步的,而且它是一个线程服务器。换句话说,将一个线程专用于WebSocket连接是不可行的。CherryPy能够挂载单独的WSGI应用程序在这里没有意义,因为WSGI本质上是一个同步协议。而且WebSockets本质上是异步的。但这并不意味着你不能用不同的方式来做。在</p>
<h2>CherryPy和ws4py</h2>
<p>幸运的是,由于CherryPy的智能设计,它不仅限于WSGI,而且允许扩展。这个事实被CherryPy贡献者Sylvain helleguarch在nice库中使用,<a href="https://ws4py.readthedocs.org/" rel="nofollow">ws4py</a>。它具有CherryPy集成。在</p>
<pre><code>#!/usr/bin/env python3
import cherrypy
from ws4py.server.cherrypyserver import WebSocketPlugin, WebSocketTool
from ws4py.websocket import WebSocket
class Ws:
@cherrypy.expose
def a(self):
'''WebSocket upgrade method.
Method must exist for ``WebSocketTool`` to work, 404 returned otherwise.
'''
@cherrypy.expose
def b(self):
pass
class HandlerA(WebSocket):
def received_message(self, message):
self.send('"A" is my reply')
class HandlerB(WebSocket):
def received_message(self, message):
self.send('"B" is my reply')
class App:
@cherrypy.expose
def index(self):
return '''<!DOCTYPE html>
<html>
<body>
<table cellspacing='10'>
<tr>
<td id='a'></td>
<td id='b'></td>
</tr>
</table>
<script type='application/javascript'>
var wsA = new WebSocket('ws://127.0.0.1:8080/websocket/a');
wsA.onmessage = function(event)
{
document.getElementById('a').innerHTML += event.data + '<br/>';
};
var wsB = new WebSocket('ws://127.0.0.1:8080/websocket/b');
wsB.onmessage = function(event)
{
document.getElementById('b').innerHTML += event.data + '<br/>';
};
setInterval(function()
{
wsA.send('foo');
wsB.send('bar');
}, 1000);
</script>
</body>
</html>
'''
if __name__ == '__main__':
cherrypy.config.update({
'server.socket_host' : '127.0.0.1',
'server.socket_port' : 8080,
'server.thread_pool' : 8
})
cherrypy.tools.websocket = WebSocketTool()
WebSocketPlugin(cherrypy.engine).subscribe()
cherrypy.tree.mount(Ws(), '/websocket', {
'/a' : {
'tools.websocket.on' : True,
'tools.websocket.handler_cls' : HandlerA
},
'/b' : {
'tools.websocket.on' : True,
'tools.websocket.handler_cls' : HandlerB
}
})
cherrypy.tree.mount(App(), '/')
cherrypy.engine.signals.subscribe()
cherrypy.engine.start()
cherrypy.engine.block()
</code></pre>
<h2>CherryPy、nginx和高速公路</h2>
<p>因为1.3<a href="http://nginx.org/" rel="nofollow">nginx</a>支持WebSockets。所以你可以很容易地复用不同的后端。在</p>
^{pr2}$