done()、result()、cancer()方法的使用
# 執行緒池, 為什麼要執行緒池
# 主線程中可以獲取某乙個執行緒的狀態,以及返回值
# 當乙個執行緒完成的時候主線程能立即知道
# futures 可以讓多執行緒和多程序編碼介面一致
from concurrent.futures import threadpoolexecutor
import time
defget_html
(times)
: time.sleep(times)
print
("get page {} success"
.format
(times)
)return times
# 建立執行緒池 指定最大容納數量為4。
executor = threadpoolexecutor(max_workers=2)
# 通過submit函式提交執行的函式到執行緒池中,submit是立即返回。
task1 = executor.submit(get_html,(3
))task2 = executor.submit(get_html,(2
))# done用於判定某個任務是否完成
print
(task1.done())
# 此處取消task2時,task2正在執行,所以取消失敗;若將max_workers修改為1,則task2可以取消成功。
print
(task2.cancel())
time.sleep(5)
print
(task1.done())
# result方法是個阻塞方法,可以獲取task的執行結果。
print
(task1.result())
"""執行結果:
false
false
get page 2 success
get page 3 success
true
3process finished with exit code 0
"""
通過wait()判斷執行緒執行的狀態
wait(fs, timeout=none, return_when=all_completed),wait接受3個引數,fs表示執行的task序列;timeout表示等待的最長時間,超過這個時間即使執行緒未執行完成也將返回;return_when表示wait返回結果的條件,預設為all_completed全部執行完成再返回:
import time
from concurrent.futures import threadpoolexecutor, wait
defget_thread_time
(times)
: time.sleep(times)
return times
start = time.time(
)executor = threadpoolexecutor(max_workers=4)
task_list =
[executor.submit(get_thread_time, times)
for times in[1
,2,3
,4]]
i =1
for task in task_list:
print
("task{}:{}"
.format
(i, task)
) i +=
1print
(wait(task_list, timeout=
2.5)
)"""
執行結果:
task1:task2:task3:task4:doneandnotdonefutures(
done=,
not_done=)
""""""
可以看到在timeout 2.5時,task1和task2執行完畢,task3和task4仍在執行中
"""
map返回執行緒的執行結果
map(fn, *iterables, timeout=none),第乙個引數fn是執行緒執行的函式;第二個引數接受乙個可迭代物件;第三個引數timeout跟wait()的timeout一樣,但由於map是返回執行緒執行的結果,如果timeout小於執行緒執行時間會拋異常timeouterror。
import time
from concurrent.futures import threadpoolexecutor
defget_thread_time
(times)
: time.sleep(times)
return times
start = time.time(
)executor = threadpoolexecutor(max_workers=4)
i =1
for result in executor.
map(get_thread_time,[2
,3,1
,4])
:print
("task{}:{}"
.format
(i, result)
) i +=
1"""
執行結果:
task1:2
task2:3
task3:1
task4:4
""""""
map的返回是有序的,它會根據第二個引數的順序返回執行的結果。
"""
as_completed返回執行緒執行結果import time
from collections import ordereddict
from concurrent.futures import threadpoolexecutor, as_completed
defget_thread_time
(times)
: time.sleep(times)
return times
start = time.time(
)executor = threadpoolexecutor(max_workers=4)
task_list =
[executor.submit(get_thread_time, times)
for times in[2
,3,1
,4]]
task_to_time = ordereddict(
zip(
["task1"
,"task2"
,"task3"
,"task4"],
[2,3
,1,4
]))task_map = ordereddict(
zip(task_list,
["task1"
,"task2"
,"task3"
,"task4"])
)for result in as_completed(task_list)
: task_name = task_map.get(result)
print
("{}:{}"
.format
(task_name,task_to_time.get(task_name)))
"""執行結果:
task3:1
task1:2
task2:3
task4:4
""""""
task1、task2、task3、task4的等待時間分別為2s、3s、1s、4s,通過as_completed返回執行完的執行緒結果,
as_completed(fs, timeout=none)接受2個引數,第乙個是執行的執行緒列表,第二個引數timeout與map的
timeout一樣,當timeout小於執行緒執行時間會拋異常timeouterror。
""""""
通過執行結果可以看出,as_completed返回的順序是執行緒執行結束的順序,最先執行結束的執行緒最早返回。
"""
ThreadPoolExecutor執行緒池原始碼解讀
主要變數 private volatile int corepoolsize private volatile int maximumpoolsize private volatile int poolsize 建構函式 也就是建立類的時候,需要注入引數。public threadpoolexecu...
ThreadPoolExecutor執行緒池引數設定
jdk1.5中引入了強大的concurrent包,其中最常用的莫過了執行緒池的實現threadpoolexecutor,它給我們帶來了極大的方便,但同時,對於該執行緒池不恰當的設定也可能使其效率並不能達到預期的效果,甚至僅相當於或低於單執行緒的效率。threadpoolexecutor類可設定的引數...
ThreadPoolExecutor執行緒池
python中已經有了threading模組,為什麼還需要執行緒池呢,執行緒池又是什麼東西呢?在介紹執行緒同步的訊號量機制的時候,舉得例子是爬蟲的例子,需要控制同時爬取的執行緒數,例子中建立了20個執行緒,而同時只允許3個執行緒在執行,但是20個執行緒都需要建立和銷毀,執行緒的建立是需要消耗系統資源...