
*****
## 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核數不一樣可能是并行的,但是協程是在一個線程中 所以是并發