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): prin "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那么简单
![]() | 1 likang 2015-08-03 00:06:56 +08:00 哇哦,大赞! |
![]() | 3 sprite0616 2015-08-03 08:49:42 +08:00 自己用tornado作为websocket服务器 |
![]() | 4 yueyoum OP |