uwsgi 已经merge了我的 pull request,
现在大家可以用下面这种更加 gevent 的方式来使用 uwsgi 的 websockets 了
class Client(object):
def __init__(self):
self.ctx = None
self.send_queue = Queue()
self.jobs = []
def _recv_job(self):
while True:
data = uwsgi.websocket_recv(request_context=self.ctx)
self.on_data(data)
def _send_job(self):
while True:
data = self.send_queue.get()
uwsgi.websocket_send(data, request_context=self.ctx)
def _exit(self, *args):
for j in self.jobs:
j.unlink(self._exit)
gevent.killall(self.jobs)
ClientManager.remove(self)
self.on_exit()
def on_data(self, data):
print "GOT: {0}".format(data)
ClientManager.broadcast(data)
def on_exit(self):
print "bye bye..."
def send(self, data):
self.send_queue.put(data)
def start(self):
uwsgi.websocket_handshake()
self.ctx = uwsgi.request_context()
ClientManager.add(self)
self.jobs.extend([
gevent.spawn(self._recv_job),
gevent.spawn(self._send_job),
])
for j in self.jobs:
j.link(self._exit)
gevent.joinall(self.jobs)
完整例子见:
https://github.com/unbit/uwsgi/blob/master/tests/websockets_chat_2.py
下一步的目标是,
模仿erlang 的两个功能:
global_register
每个greenlet 都可以全局注册自己, 然后其他 greenlet 直接 call(ID, data) or cast(ID, data)
就可以发送消息给对应的greenlet
gp2, process_group
给 greenlet 分组用的。 给这个组发消息,这个组里面的每个greenlet 都会收到消息。
实现方式可能是:
最后的目标就是 让以上功能也能用在 uwsgi 集群中, 这样一个分布式的websocket server就能很容易的实现了。并且跑在上面的python 代码,greenlets 之间的通信可以像erlang那么简单
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.