![](https://img.kancloud.cn/41/e0/41e066af9a6c25a24868d9667253ec98_1241x333.jpg)
*****
## Python多任务-协程
### 同步、异步
同步:是指代码调用IO操作时,必须等待IO操作完成才返回的调用方式
异步:是指代码调用IO操作时,不必等IO操作完成就返回的调用方式
### 阻塞、非阻塞
阻塞:从调用者的角度出发,如果在调用的时候,被卡住,不能再继续向下运行,需要等待,就说是阻塞
非阻塞:从调用者的角度出发, 如果在调用的时候,没有被卡住,能够继续向下运行,无需等待,就说是非阻塞
### 生成器-send方法
send方法有一个参数,该参数指定的是上一次被挂起的yield语句的返回值
### 使用yield完成多任务
~~~
import time
def task1():
while True:
print("--1--")
time.sleep(0.1)
yield
def task2():
while True:
print("--2--")
time.sleep(0.1)
yield
def main():
t1 = task1()
t2 = task2()
while True:
next(t1)
next(t2)
if __name__ == "__main__":
main()
~~~
### yield from介绍
python3.3新加了yield from语法
~~~
def generator_1():
total = 0
while True:
x = yield
print('加', x)
if not x:
break
total += x
return total
def generator_2(): # 委托生成器
while True:
total = yield from generator_1() # 子生成器
print('加和总数是:', total)
def main(): # 调用方
# g1 = generator_1()
# g1.send(None)
# g1.send(2)
# g1.send(3)
# g1.send(None)
g2 = generator_2()
g2.send(None)
g2.send(2)
g2.send(3)
g2.send(None)
if __name__ == '__main__':
main()
【子生成器】:yield from后的generator_1()生成器函数是子生成器
【委托生成器】:generator_2()是程序中的委托生成器,它负责委托子生成器完成具体任务。
【调用方】:main()是程序中的调用方,负责调用委托生成器。
~~~
## 协程
协程,又称微线程
协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)
Python中的协程大概经历了如下三个阶段:
1. 最初的生成器变形yield/send
2. yield from
3. 在最近的Python3.5版本中引入async/await关键字
### 使用greenlet完成多任务
安装模块:pip3 install greenlet
### 使用gevent完成多任务
安装模块:pip3 install gevent
### 简单总结
* 进程是资源分配的单位
* 线程是操作系统调度的单位
* 进程切换需要的资源很最大,效率很低
* 线程切换需要的资源一般,效率一般(当然了在不考虑GIL的情况下)
* 协程切换任务资源很小,效率高
* 多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发