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