协程和函数调用有什么区别:
函数调用是顺序执行的,如果调用2次,每次 sleep 10 秒,则总共休息20秒;
如果用协程,调用2次,每次休息 10秒,则总共 10 秒就完成了。
所有的协程分享进程的时间片,每个时间点只能有一个协程在执行代码。
如果正在执行的某个协程发生 IO 阻塞,则会把其换出,从而去执行其他 IO 就绪的协程。相当于说“利用 IO 阻塞等待的时间去执行其他 IO 就绪的协程,整个过程是自动切换的。
# -*- coding: utf-8 -*-
import datetime
import time
from gevent import monkey; monkey.patch_all()
import gevent
def f(tmp_list):
tmp_list.append(1)
time.sleep(10)
mylist = list()
def hello():
# 从总体的执行时间和变量 mylist 的值,来理解协程和函数调用的区别
print datetime.datetime.now()
gevent.joinall([
gevent.spawn(f, mylist),
gevent.spawn(f, mylist),
])
print 'mylist = {0}'.format(mylist)
print datetime.datetime.now()
if __name__ == '__main__':
hello()
The output of the demo:
2020-04-29 16:15:44.287000
mylist = [1, 1]
2020-04-29 16:15:54.288000
多线程比,协程有何优势?
最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。