多工的實現方式,使用下面方法中的乙個或者若干個進行組合:
1、多程序
2、多執行緒
3、協程
三種方式的實現和資源占用各有不同,其中資源占用和實現所需的系統開銷(記憶體、cpu等)逐漸減少,實現難度依次降低。
可以簡單的認為:乙個程序可以包含多個執行緒,乙個執行緒包含多個協程。
多工實現方式的選擇:
cpu密集型任務:使用多程序
io密集型:使用多執行緒或協程
非同步:後面**無需等待(非阻塞)前面**執行完即可執行。
併發:簡單地理解為cpu數量小於程序數。
並行:簡單地理解為cpu數量大於或等於程序數。
協程的發展:python2時期的生成器(yield、yiled from)函式,到了python3進一步封裝為async、await關鍵字實現的方法。
包含yield關鍵字的函式即為生成器函式。
生成器的呼叫:使用for迴圈或者next(生成器);
與生成器的資料互動:使用生成器的send方法;
關閉生成器:close方法。
生成器執行過程:
def mtd():
a = 1
x = 2
while true:
x = yield a
a += 1
if a > 10:
break
print(x)
y = mtd()
next(y)
y.send(2)
執行順序:
next --> 返回 a值1 --> send 2 --> x = 2 --> print 2
yield from 返回生成器物件(或者生成器函式的返回(return)值)
基本用法:
lis = [1, 2, 3]
def generator_2(lis):
yield from lis
z=generator_2(lis)
type(z) #
複雜用法:
# 子生成器
def generator_1():
total = 0
while true:
x = yield
print('加', x)
if not x: # if not none: true
break
total += x
return total
# 委託生成器
def generator_2():
while true:
# 建立呼叫方和子生成器的通道
total = yield from generator_1() # 子生成器
print('加和總數是:', total)
# 呼叫方
def main():
g2 = generator_2()
g2.send(none)
g2.send(2)
g2.send(3)
g2.send(none)
if __name__ == '__main__':
main()
第三方模組
由於是第三方模組,需要安裝
pip install greenlet
pip install gevent
gevent
import gevent
from gevent import monkey
monkey.patch_all() # 為下面的requests模組打補丁,進行重寫和封裝
import requests
def download(url):
print("get: %s" % url)
res = requests.get(url)
data = res.text
print(len(data), url)
# 多工
g1 = gevent.spawn(download, '') # 建立協程
g2 = gevent.spawn(download, '')
g3 = gevent.spawn(download, '')
g1.join()#等待協程結束
g2.join()
g3.join()
# 另一種實現方法
#gevent.joinall([
gevent.spawn(download, ''),
gevent.spawn(download, ''),
gevent.spawn(download, '')
])
greenlet
from greenlet import greenlet
import time
# 協程利用程式的io 來切換任務
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)
gr2 = greenlet(demo2)
gr1.switch() # 啟用協程
序列合併:
from itertools import chain
lis = [1, 2, 3]
dic =
print(list(chain(lis, dic, range(5, 10))))
Python 多工之協程(3)實現多工
學習理解迭代器和生成器之後,開始使用協程來實現多工 當乙個函式中包含yield關鍵字,那麼這個函式就不再是乙個普通的函式,它的返回值是乙個生成器物件。我們可以使用next 或send 函式來啟動喚醒生成器物件,當程式第一次執行到yield時,程式暫停執行,並返回yield後邊跟的變數,當再次喚醒時,...
Python 多工 協程
高階程式設計技巧 學習筆記 1.1 同步 非同步 1.2 阻塞 非阻塞 2.1 什麼是協程?協程,又稱微執行緒。協程是 python 個中另外一種實現多工的方式,只不過比執行緒更小占用更小執行單元 理解為需要的資源 2.2 python中的協程大概經歷了如下三個階段 最初的生成器變形yield se...
多工實現方式 一
執行起來的應用程式就稱之為程序。也就是說當程式不執行的時候我們稱之為程式,當 程式執行起來他就是乙個程序。通俗的理解就是不執行的時候是程式,執行起來就是程序。程式和程序的對應關係是 程式只有乙個,但是程序可以有多個。程序是系統進行資源分配和排程的基本單位。在程式執行的過程中,由於被作業系統的排程演算...