Python协程Gevent模块详解:进程、线程、协程区分

1 下载量 195 浏览量 更新于2024-08-29 收藏 102KB PDF 举报
Python 之协程 Gevent 模块详解 协程(Coroutine)是一种轻量级的线程,即微线程。协程的出现是为了解决传统线程和进程的不足之处。那么什么是协程?协程是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程。在 Linux 系统中,线程就是轻量级的进程,而我们通常也把协程称为轻量级的线程即微线程。 进程、线程、协程的区分: 进程和协程有相同点和不同点。相同点在于,当我们挂起一个执行流的时,我们要保存的东西:栈,其实在你切换前你的局部变量,以及要函数的调用都需要保存,否则都无法恢复;寄存器状态,这其实用于当你的执行流恢复后要做什么。寄存器和栈的结合就可以理解为上下文,上下文切换的理解:CPU 看上去像是在并发的执行多个进程,这是通过处理器在进程之间切换来实现的,操作系统实现这种交错执行的机制称为上下文切换。 不同点是执行流的调度者不同,进程是内核调度,而协程是在用户态调度,也就是说进程的上下文是在内核态保存恢复的,而协程是在用户态保存恢复的,很显然用户态的代价更低。进程会被强占,而协程不会,也就是说协程如果不主动让出 CPU,那么其他的协程,就没有执行的机会。对内存的占用不同,实际上协程可以只需要 4K 的栈就足够了,而进程占用的内存要大的多。 线程和协程的比较: 既然我们上面也说了,协程也被称为微线程,下面对比一下协程和线程:线程之间需要上下文切换成本相对协程来说是比较高的,尤其在开启线程较多时,但协程的切换成本非常低。同样的线程的切换更多的是靠操作系统来控制,而协程的执行由我们自己控制。协程只是在单一的线程里不同的协程之间切换,其实和线程很像,线程是在一个进程下,不同的线程之间做切换,这也可能是协程称为微线程的原因吧。 Gevent 模块: Gevent 是一种基于协程的 Python 网络库,它用到 Greenlet 提供的,封装了 libev。Gevent 模块提供了一个高效的异步 I/O 模型,可以轻松地编写高性能的网络服务器和客户端。Gevent 模块的主要特点是: * 使用协程来实现异步 I/O * 使用 Greenlet 提供的轻量级线程来实现协程 * 封装了 libev 库来提供高效的异步 I/O 模型 * 提供了一个简单易用的 API 来编写高性能的网络服务器和客户端 Gevent 模块提供了一个高效的异步 I/O 模型,可以轻松地编写高性能的网络服务器和客户端。