python執行緒池

2022-09-08 20:00:19 字數 3268 閱讀 6638

個人部落格,歡迎來撩 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...