协程
一、gevent
pip install gevent
from gevent import monkey
import gevent
import random
import time
# 有耗时操作时需要
monkey.patch_all() # 将程序中用到的耗时操作的代码,换为gevent中自己实现的模块
def gevent_01(name):
for i in range(10):
print(name, i)
time.sleep(random.random())
if __name__ == '__main__':
g1 = gevent.spawn(gevent_01, "小明")
g2 = gevent.spawn(gevent_01, "小友")
g1.join()
g2.join()
必须join,因为协程只是依赖在线程上的,当主线程结束,则协程直接结束。
二、全部启动并完成joinall
from gevent import monkey
import gevent
import random
import time
# 有耗时操作时需要
monkey.patch_all() # 将程序中用到的耗时操作的代码,换为gevent中自己实现的模块
def gevent_01(name):
for i in range(10):
print(name, i)
time.sleep(random.random())
if __name__ == '__main__':
gevent.joinall(
[
gevent.spawn(gevent_01,"小明"),
gevent.spawn(gevent_01,"小友")
]
)
三、进程、线程、协程
- 进程是操作系统资源分配的单位
- 线程是CPU调度的单位
- 进程切换需要的资源最大,效率很低
- 线程切换需要的资源一般,效率一般(当然在不考虑GIL的情况下)
- 协程切换任务资源很小,效率高
- 多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发
四、GIL
由于GIL锁的存在,所以当python脚本是I/O密集型时,线程才会有提高执行的效率,CPU密集型有可能会降低效率。