协成与异步IO

协程又称为微线程,纤程。英文名Coroutine
协程看上去是函数,但执行过程中,在函数内部中断后,然后转而执行别的函数,
在适当的时候返回来接着执行。
python可以通过yield/send的方式实现协程,也可以使用第三方库中的greenlet来
实现协程。
协程的优势
协程的特点在于是一个线程执行。(本质)
所以协程的最大的优势就是极高的执行效率。因为子程序切换不是线程切换,而是
由程序自身控制,因此 ,没有线程切换的开销,和多线程比,线程数量越多,
协程的性能优势越明显。(因为内部封装了CPU的上下文)
就是不需要多线程的锁的机制,因为只有一个线程,也不存在同时写
变量的冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行
效率比线程高很多。
Greenlet
为了更好使用协程来完成多任务,Python中的greenlet模块对其封装,从而使得
切换任务变得更加简单
安装greenlet模块使用:pip install greenlet
协程的缺陷
无法利用多核资源:协程的本质是单线程,他不能同时将CPU的多个核用上,
协程需要和进程配合才能运行在多CPU上。日常编写的绝大部分没这个必要,
除非是CPU密集型应用。(gevent)
进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序。
同步IO操作:导致请求进程阻塞,直到IO 操作完成。
异步IO操作:不导致进程阻塞。
Gevent
greenlet已经实现了协程,但是这个还得人工切换,是不是觉得太麻烦了,不要
着急,python还有一个比greenlet更强大的并且能够自动切换任务的模式gevent
其原理是当一个greenlet携带IO操作时(值的是input output 输入输出,比如网络
文件操作等)比如访问网络,就自动切换到其他的greenlet ,等到IO操作完成,在适当的时候切换回来继续执行。
由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,
就保证总有greenlet在运行,而不是等待IO
安装gevent命令模块:pip install gevent
gevent的基本使用方式
gevent.spawn(func, *args, …)方法用来生成协程,他接受一个函数作为参数

gevent.joinall([t1, t2, …])方法用来启动协程轮询并等待运行结果

gevent.sleep()用来模拟一个IO操作,阻塞后自动切换到另一个协程执行

上一篇:python – RethinkDB:​​连接多少?


下一篇:python-具有redis pubsub的Django / gevent socket.IO.我在哪里放东西?