個人部落格,歡迎來撩 fangzengye.com
當程式中需要建立大量生存期很短暫的執行緒時,更應該考慮使用執行緒池。
執行緒池在系統啟動時即建立大量空閒的執行緒,程式只要將乙個函式提交給執行緒池,執行緒池就會啟動乙個空閒的執行緒來執行它。當該函式執行結束後,該執行緒並不會死亡,而是再次返回到執行緒池中變成空閒狀態,等待執行下乙個函式。
可以控制併發多執行緒的數量,不會導致系統崩潰
concurrent.futures.executor 提供了兩個子類
threadpoolexecutor :用於建立執行緒池
processpoolexecutor :用於建立程序池方法
函式提交(submit)給執行緒池後,submit 方法會返回乙個 future 物件,future 類主要用於獲取執行緒任務函式的返回值。由於執行緒任務會在新執行緒中以非同步方式執行,因此,執行緒執行的函式相當於乙個「將來完成」的任務,所以 python 使用 future 來代表。
返回threadpool屬於future型別,future 提供了如下方法:
def test(value1, value2=none):
print("%s threading is printed %s, %s"%(threading.current_thread().name, value1, value2))
time.sleep(2)
return 'finished'
def test_result(future):
print(future.result())
ifname== "main":
import numpy as np
from concurrent.futures import threadpoolexecutor
threadpool = threadpoolexecutor(max_workers=4, thread_name_prefix="test_")
for i in range(0,10):
future = threadpool.submit(test, i,i+1)
threadpool.shutdown(wait=true)
結果如下
結果:
test__0 threading is printed 0, 1
test__1 threading is printed 1, 2
test__2 threading is printed 2, 3
test__3 threading is printed 3, 4
test__1 threading is printed 4, 5
test__0 threading is printed 5, 6
test__3 threading is printed 6, 7
直接呼叫result函式結果
def test(value1, value2=none):
print("%s threading is printed %s, %s"%(threading.current_thread().name, value1, value2))
time.sleep(2)
return 'finished'
def test_result(future):
print(future.result())
ifname== "main":
import numpy as np
from concurrent.futures import threadpoolexecutor
threadpool = threadpoolexecutor(max_workers=4, thread_name_prefix="test_")
for i in range(0,10):
future = threadpool.submit(test, i,i+1)
print(future.result())
threadpool.shutdown(wait=true)
print('main finished')
結果如下
結果:
test__0 threading is printed 0, 1
finished
test__0 threading is printed 1, 2
finished
test__1 threading is printed 2, 3
finished
exectuor 還提供了乙個map(func, *iterables, timeout=none, chunksize=1)
方法,該方法的功能類似於全域性函式 map(),區別在於執行緒池的 map() 方法會為 iterables 的每個元素啟動乙個執行緒,以併發方式來執行 func 函式。這種方式相當於啟動 len(iterables) 個執行緒,井收集每個執行緒的執行結果。
例如,如下程式使用 executor 的 map() 方法來啟動執行緒,並收集執行緒任務的返回值:
def test(value1, value2=none):
print("%s threading is printed %s, %s"%(threading.current_thread().name, value1, value2))
# time.sleep(2)
ifname== "main":
import numpy as np
from concurrent.futures import threadpoolexecutor
threadpool = threadpoolexecutor(max_workers=4, thread_name_prefix="test_")
for i in range(0,10):
threadpool.map(test, [i],[i+1]) # 這是執行一次test的引數,眾所周知map可以讓test執行多次,即乙個代表乙個引數,乙個引數賦予不同的值即增加的長度如從[1]到[1,2,3]
threadpool.shutdown(wait=true)
參考文獻
python 執行緒池 Python的執行緒池
usr bin env python coding utf 8 concurrent 用於執行緒池和程序池程式設計而且更加容易,在python3.2中才有。import sys from concurrent.futures import threadpoolexecutor,as complete...
python 執行緒池 python執行緒池原始碼解析
本篇主要講下threadpoolexecutor的實現。由於業務量不大,且一直使用框架進行程式設計,對執行緒的理解一直很模糊,基本處於不想阻塞程式執行,起乙個執行緒啟動任務的階段。總感覺自己好像會執行緒一樣,實則一直處於一種懵懂狀態,通過一段時間檢視一些別人寫的原始碼,終於有所悟,也記錄下自己的學習...
python執行緒池
import time threadpool為執行緒池模組 import threadpool deftest str print str time.sleep 2 if name main starttime time.time 建立執行緒池,最多建立的執行緒數為10 pool threadpoo...