Python 使用gevent、gevent-websocket实现websocket服务端程序

一、gevent简介

Python通过yield提供了对协程的基本支持,但是不完全。而第三方的gevent为Python提供了比较完善的协程支持。

gevent是第三方库,通过greenlet实现协程,其基本思想是:

当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。

gevent.spawn()会创建一个协程并且运行

gevent.sleep()会造成阻塞,切换到其他协程继续执行

gevent.joinall([])会等待所有传入的协程运行结束后再退出

二、简单的实例

安装需要的模块:

pip install gevent-websocket

pip install gevent

pip install flask

代码实现:

from flask import Flask
from geventwebsocket import WebSocketError
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler

app = Flask(__name__)
users = set()
@app.route('/websocket/')
def handle_websocket():
    wsock = request.environ.get('wsgi.websocket')
    users.add(wsock)

    if not wsock:
        abort(400, 'Expected WebSocket request.')

    while True:
        try:
            message = wsock.receive() # 接收客户端发来的信息
        except WebSocketError:
            break

        print u"现有连接用户:%s" % (len(users))

        if message:
            for user in users:
                try:
                    user.send(message) # 给客户端推送信息
                except WebSocketError:
                    print u'用户已断开连接'

    # 如果有客户端断开,则删除这个断开的websocket
    users.remove(wsock)

if __name__ == '__main__':
    server = WSGIServer(("0.0.0.0", 8000), app, handler_class=WebSocketHandler)
    server.serve_forever()

猜你喜欢

转载自blog.csdn.net/u011146423/article/details/88622881
今日推荐