程序是資源分配的最小單位,執行緒是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要以乙個整體的形式暴露給作業系統功能管理,裡面包含對各種資源的呼叫。記憶體對各種資源管理的集合 就...