Python的執行緒與程序

2021-10-12 08:39:28 字數 3582 閱讀 8355

程序是資源分配的最小單位,執行緒是cpu排程的最小單位。執行緒可以讓應用程式併發的執行多個任務,執行緒之間方便共享資源,程序之間資訊難以共享。

引用知乎大佬的比喻,程序=火車,執行緒=車廂:

簡單使用

from concurrent.futures import threadpoolexecutor

import time

# 引數times用來模擬網路請求的時間

defget_html

(times)

: time.sleep(times)

print

("get page {}s finished"

.format

(times)

)return times

executor = threadpoolexecutor(max_workers=2)

# 通過submit函式提交執行的函式到執行緒池中,submit函式立即返回,不阻塞

task1 = executor.submit(get_html,(3

))task2 = executor.submit(get_html,(2

))# done方法用於判定某個任務是否完成

print

(task1.done())

# cancel方法用於取消某個任務,該任務沒有放入執行緒池中才能取消成功

print

(task2.cancel())

time.sleep(4)

print

(task1.done())

# result方法可以獲取task的執行結果

print

(task1.result())

# 執行結果

# false # 表明task1未執行完成

# false # 表明task2取消失敗,因為已經放入了執行緒池中

# get page 2s finished

# get page 3s finished

# true # 由於在get page 3s finished之後才列印,所以此時task1必然完成了

# 3 # 得到task1的任務返回值

threadpoolexecutor構造例項,max_workers控制同時執行的最大的執行緒數量。

使用submit函式來提交執行緒需要執行的任務(函式名和引數)到執行緒池中,並返回該任務的控制代碼(類似於檔案、畫圖),注意submit()不是阻塞的,而是立即返回。返回的任務控制代碼,能夠使用done()來方法判斷該任務是否結束。

使用**result()**方法可以獲取任務的返回值。

as_completed

在使用submit提交任務後,可以使用as_completed方法一次性取出所有的控制代碼獲取結果並判斷完成情況。

from concurrent.futures import threadpoolexecutor, as_completed

import time

# 引數times用來模擬網路請求的時間

defget_html

(times)

: time.sleep(times)

print

("get page {}s finished"

.format

(times)

)return times

executor = threadpoolexecutor(max_workers=2)

urls =[3

,2,4

]# 並不是真的url

all_task =

[executor.submit(get_html,

(url)

)for url in urls]

for future in as_completed(all_task)

: data = future.result(

)print

("in main: get page {}s success"

.format

(data)

)# 執行結果

# get page 2s finished

# in main: get page 2s success

# get page 3s finished

# in main: get page 3s success

# get page 4s finished

# in main: get page 4s success

as_completed()方法是乙個生成器,在沒有任務完成的時候,會阻塞,在有某個任務完成的時候,會yield這個任務,就能執行for迴圈下面的語句,然後繼續阻塞住,迴圈到所有的任務結束。從結果也可以看出,先完成的任務會先通知主線程

map使用map方法,無需提前使用submit方法,map方法與python標準庫中的map含義相同,都是將序列中的每個元素都執行同乙個函式。上面的**就是對urls的每個元素都執行get_html函式,並分配各執行緒池。可以看到執行結果與上面的as_completed方法的結果不同,輸出順序和urls列表的順序相同,就算2s的任務先執行完成,也會先列印出3s的任務先完成,再列印2s的任務完成。

map可以傳入多引數執行緒

from concurrent.futures import threadpoolexecutor

import time

# 引數times用來模擬網路請求的時間

defget_html

(times,pick)

: time.sleep(times)

print

("get page {}s finished"

.format

(times)

)print

("get pick is {}."

.format

(pick)

)return times

executor = threadpoolexecutor(max_workers=2)

urls =[3

,2,4

]# 並不是真的url

picks =

['a'

,'b'

,'c'

]for data in executor.

map(get_html, urls, picks)

:print

("in main: get page {}s success"

.format

(data)

)# get page 2s finished

# get pick is b.

# get page 3s finished

# get pick is a.

# in main: get page 3s success

# in main: get page 2s success

# get page 4s finished

# get pick is c.

# in main: get page 4s success

Python的執行緒與程序

三 執行緒 四 守護執行緒 總結在實際運用中python程式往往要處理多個任務,那麼如何讓python程式執行多工呢?這就用到了執行緒和程序,執行緒和程序又各有特點,下面就進一步闡述執行緒和程序 1.1.多工就是同一時間,多個任務 1.2.併發 在一段時間內交替執行多個任務 1.3並行 同時在一起執...

python執行緒與程序

直接呼叫 import threading,time def run n print running n time.sleep 2 t1 threading.thread target run,args test1 生成乙個執行緒例項 t2 threading.thread target run,a...

python 程序與執行緒

執行緒是作業系統能夠進行運算排程的最小單位,它包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序中可以併發多個執行緒,每條執行緒並行執行不 同的任務。程序 qq要以乙個整體的形式暴露給作業系統功能管理,裡面包含對各種資源的呼叫。記憶體對各種資源管理的集合 就...