协程
协程 又称微线程
协程是pthon中别外一种实现多任务的方式 只不过比线程更小占用更小执行单元(理解为需要的资源)
python中的协程大概经历了如下三下阶段:
1.最初的生成器变形yield/send
2.yield from
3.在最近的python3.5版本中引入async/await关键字
使用greenlet完成多任务
安装模块: pip install greenlet
使用gevent完成多任务
安装模块: pip install gevent
简单总结
. 进程是资源分配的单位
. 线程是操作系统调度的单位
. 进程切换需要的资源最大,效率很低
. 线程切换需要的资源一般 效率一般(在不考虑GIL的情况下)
. 协程切换任务资源很小 效率高
. 多进程 多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发
greenlet --协程利用程序的IO 来切换任务
from greenlet import greenlet
import time
def demo1():
while True:
print('demo1')
gr2.switch()
time.sleep(0.5)
def demo2():
while True:
print('demo2')
gr1.switch()
time.sleep(0.5)
gr1 = greenlet(demo1)
# print(greenlet.__doc__)
gr2 = greenlet(demo2)
gr1.switch()
gr2.switch()
gevent完成多任务
import gevent
import time
from gevent import monkey
# 将程序中用到的耗时操作 换为gevent 实现的模块 相当于打补丁
monkey.patch_all()
def f1(n):
for i in range(n):
print(gevent.getcurrent(),i)
time.sleep(0.5)
# gevent.sleep(0.5)
def f2(n):
for i in range(n):
print(gevent.getcurrent(),i)
time.sleep(0.5)
# gevent.sleep(0.5)
def f3(n):
for i in range(n):
print(gevent.getcurrent(),i)
time.sleep(0.5)
# gevent.sleep(0.5)
print('--1--')
g1 = gevent.spawn(f1,5)
print('--2--')
time.sleep(0.5)
# gevent.sleep(0.5)
g2 = gevent.spawn(f2,5)
print('--3--')
g3 = gevent.spawn(f3,5)
print('--4--')
g1.join()
g2.join()
g3.join()