协程的概念及Python中利用第三方库gevent使用协程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28766327/article/details/78107306

提到程序的并发操作,大多数人程序员首先想到的进程或者线程。我们先复习一下进程和线程的概念。
  进程:
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序执行的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体
  线程:
线程,是程序执行的最小单元。一个标注的线程由线程ID,当前指令指针,寄存器集合和堆栈组成。另外,线程也是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可以与同属一个进程的其他线程共享进程所拥有全部资源。一个线程创建和撤销另一个线程,同一个进程中的多个线程并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有运行、阻塞、和就绪三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机。运行状态是指线程战友处理剂正在运行。阻塞状态是指线程在等待一个事件,逻辑上不可执行。每个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
(以上内容来自百度百科,它从哪里来的就不知道了 ┑( ̄Д  ̄)┍ )

然后再说我们今天的主角协程
协程最大的优势是他比线程更高的执行效率。协程不需要切换线程,没有线程切换的开销。和多线程相比,线程数量越多,协程的性能优势就越明显。第二大优势就是不需要多线程锁机制。因为只有一个线程,也不存在同时写变量冲突(意思就是说协程在同一时刻绝对只有一个在执行,多线程中如果多个线程都需要对某变量进行修改,如果不加入多线程锁,就可能出现多个线程同时对一个变量进行修改的问题)所以协程执行效率要高得多。协程只在一个线程中执行。如果想要利用多核cpu,最简单的办法是多进程+协程。

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

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

由于切换是在IO操作时自动完成,所以gevent需要修改Python自带的一些标准库,这一过程在启动时通过monkey patch完成

使用方法

from gevent import monkey; monkey.patch_socket()
import gevent

def f(p):
    print p
spawns = []
spawns.append(gevent.spawn(f,55))
spawns.append(gevent.spawn(f,13))
spawns.append(gevent.spawn(f,66))
gevent.joinall(spawns)

以上就是我在写程序是最常用到的部分,程序会在所有spawns都执行完毕后,接着执行 gevent.joinall(spawns) 后面的代码
另外网上说gevent只能在Linux/Unix下运行,在Windows下不能保证正常安装和运行。亲测,以上说法纯属胡说八道。

猜你喜欢

转载自blog.csdn.net/qq_28766327/article/details/78107306