基于 epoll 的回调式编程模式,但是却难以使用。即使可以通过配合 生成器协程 进行复杂的封装,以简化编程难度。
但是仍然有一个大的问题: 封装难度大,现有代码几乎完全要重写gevent,通过封装了 libev(基于epoll) 和 greenlet 两个库。做好封装,允许以类似于线程的方式使用协程。
>>>gevent 并发服务器
进群:960410445 即可获取数十套PDF!
# 将 Python 内置的 socket 直接换成封装了 IO 多路复用的 socket
>>>from gevent import monkey; monkey.patch_socket()
# 工作协程的内容
>>>def worker_coroutine(conn):
# 生成一个协程,并将 conn 作为参数传入
>>>gevent.spawn(worker_coroutine, conn)
遇到阻塞就切换到另一个协程继续执行 !
- 使用基于 epoll 的 libev 来避开阻塞
- 使用基于 gevent 的 高效协程 来切换执行
- 只在遇到阻塞的时候切换,没有轮询的开销,也没有线程的开销
Gevent 是一个第三方库,可以轻松通过gevent实现协程程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。
gevent会主动识别程序内部的IO操作,当子程序遇到IO后,切换到别的子程序。如果所有的子程序都进入IO,则阻塞。