併發程式設計 協程 池,io模型

2022-06-28 10:06:12 字數 3186 閱讀 7722

一、執行緒池、程序池

開程序、開執行緒都需要消耗資源,只不過兩者比較的情況執行緒消耗的資源比較少

在計算機能夠承受範圍之內最大限度的利用計算機

什麼是池?

在保證計算機硬體安全的情況下最大限度的利用計算機

池其實是降低了程式的執行效率,但是保證了計算機硬體的安全

(硬體的發展跟不上軟體的速度)

#

呼叫from concurrent.futures import

threadpoolexecutor,processpoolexecutor

#建池子

pool = processpoolexecutor() #

預設是當前計算機cpu的個數

pool = threadpoolexecutor(5) #

括號可穿引數,不傳預設代表cpu個數*5

res =pool.submit(task,i).add_done_callback(call_back)

#提交任務,繫結乙個**函式,一旦該任務有結果,立刻執行對於的**函式

res.result()

#原地等待任務的返回結果

pool.shutdown()

#關閉池子,等待池子中所有的任務執行完畢之後,才會往下執行**

import

time

from concurrent.futures import

threadpoolexecutor,processpoolexecutor

#pool = threadpoolexecutor(5) # 括號內可以傳引數指定執行緒池內的執行緒個數

## # 也可以不傳,不傳預設是當前所在計算機的 cpu的個數乘5

import

ospool = processpoolexecutor() #

預設是當前計算機cpu的個數

'''尺子中建立的程序/執行緒建立一次就不會再建立了,

至始至終用的都是最初的那幾個,這樣的話節省了反覆開闢程序/執行緒的資源

'''def

task(n):

print(n,os.getpid()) #

檢視當前程序號

time.sleep(2)

return n*2

defcall_back(n):

print('

拿到了非同步提交的任務的返回結果:

',n.result())

'''提交任務的方式

同步:提交任務之後,原地等待任務的返回結果,期間不做任何事

'''#

pool.submit(task,1) # 朝執行緒池中提交任務 ,非同步提交

#print('主')

'''非同步**機制:當非同步提交的任務有返回結果之後,會自動出發**函式的執行

'''#

if __name__ == '__main__':

#t_list =

#for i in range(5):

## 提交任務的時候,繫結乙個**函式,一旦該任務有結果,立刻執行對於的**函式

#res = pool.submit(task,i).add_done_callback(call_back)

## print(res.result()) # 原地等待任務的返回結果##

### pool.shutdown() # 關閉池子,等待池子中所有的任務執行完畢之後,才會往下執行**

## print(t_list)

## for p in t_list:

## print('>>>:',p.result())

### 最終版本

if__name__ == '

__main__':

for i in range(5):

res = pool.submit(task,i).add_done_callback(call_back)

案例

二、協程

完全是程式設計師自己想出來的名詞,單執行緒下實現併發(併發:切換+儲存狀態)

程序、執行緒、協程之間區別:

程序:資源單位

執行緒:執行單位

協程:單執行緒下實現併發

'''

gevent模組

'''from gevent import monkey;monkey.patch_all() #

由於該模組經常被使用,建議寫成一行

from gevent import

spawn

import

time

'''注意gevent模組沒辦法自動識別time.sleep等io情況

需要手動再配置乙個引數

'''def

heng():

print("哼"

) time.sleep(2)

print('哼'

)def

ha():

print('哈'

) time.sleep(3)

print('哈'

)def

heiheihei():

print('

嘿嘿嘿'

) time.sleep(5)

print('

嘿嘿嘿'

)start =time.time()

g1 =spawn(heng)

g2 = spawn(ha) #

spawn 會檢測所有的任務

g3 =spawn(heiheihei)

g1.join()

g2.join()

g3.join()

print(time.time()-start)

三、io模型:

阻塞io

非阻塞io

多路復用io

非同步io

併發程式設計 執行緒池程序池協程

1.socket服務端實現併發 現在回來想網路程式設計服務端需要滿足哪幾點需求 2.程序池執行緒池介紹 執行緒不可能無限制的開下去,總要消耗和占用資源 程序池執行緒池概念 硬體有極限,為了減輕硬體壓力,所以有了池的概念 注意協程這個概念完全是程式設計師自己想出來的東西,它對於作業系統來說根本不存在。...

協程 IO模型

一 協程 1.定義 單執行緒實現併發,可以再應用程式當中控制多個任務的切換 儲存狀態。優點 在應用程式級別的速度要遠遠高於作業系統的切換 缺點 多個任務一旦有乙個任務阻塞住了,沒有及時切換,整個執行緒都將阻塞在原地,該執行緒內的其他任務都不能繼續執行了。所以,在引入協程之後,就需要檢測單執行緒下所有...

併發程式設計 協程

一 協程介紹 協程 是單執行緒下的併發,又稱微執行緒,纖程。英文名coroutine。一句話說明什麼是執行緒 協程是一種使用者態的輕量級執行緒,即協程是由使用者程式自己控制排程的。需要強調的是 對比作業系統控制線程的切換,使用者在單執行緒內控制協程的切換 優點如下 缺點如下 總結 必須在只有乙個單執...