物件導向開發中,大家知道建立和銷毀物件是很費時間的,因為建立乙個物件要獲取記憶體資源或者其它更多資源。無節制的建立和銷毀執行緒是一種極大的浪費。那我們可不可以把執行完任務的執行緒不銷毀而重複利用呢?彷彿就是把這些執行緒放進乙個池子,一方面我們可以控制同時工作的執行緒數量,一方面也避免了建立和銷毀產生的開銷。
執行緒在官方文件沒有明確說明,但是是在multiprocessing 中給出了定義
from multiprocessing.pool import threadpool
import threading,time
pool = threadpool(3);#定義乙個執行緒池,執行緒池中有3個執行緒,等待呼叫
def double(n):
t = threading.currentthread()
time.sleep(1)
print('當前程序名:{},計算結果為{}'.format(t.name,n*2))
pool.map(double,range(5));
列印結果:
當前程序名:thread-110,計算結果為2
當前程序名:thread-112,計算結果為0
當前程序名:thread-111,計算結果為4
當前程序名:thread-110,計算結果為6
當前程序名:thread-112,計算結果為8
下面我們自定義乙個執行緒:
import threading, queue,time
def double(n):
return 2*n
class mythread(threading.thread):#自定義乙個程序類
def __init__(self,queue):
super(mythread,self).__init__()##先繼續父類所有的屬性
self._queue = queue# 用來儲存傻
self.daemon = true# 程序必須是守護程序(程序完成後不會死掉)
self.start()#程序是要啟動狀態
def run(self):#重定義run函式
while 1:
f,args,kargs = self._queue.get()#f為函式,其它為引數
try:
print('using {}'.format(self._name))#列印程序名
print(f(*args,**kargs))
except exception as e:
print(e)
self._queue.task_done() ## 任務完成,
class threadpool():##定義一俱個執行緒池
def __init__(self,size):
self._queue =queue.queue(size)
for _ in range(size):#在程序池生成程序
mythread(self._queue)
def add_task(self,f,*args,**kargs):
self._queue.put((f, args, kargs))#給程序執行任務
def wail_complete(self):
self._queue.join()#阻礙程序到其它程序全部完成
pool = threadpool(5)
for i in range(10):#給執行緒池中加了10個任務
pool.add_task(double,i)
time.sleep(0.5)
pool.wail_complete()
執行結果:
using thread-121
0using thread-122
2using thread-123
4using thread-124
6using thread-125
8using thread-121
10using thread-122
12using thread-123
14using thread-124
16using thread-125
18結果分析 :十個任務,用的始終是程序池中的五個程序
用Executors工具類建立執行緒池
多執行緒技術主要解決處理器單元內多個執行緒執行的問題,它可以顯著減少處理器單元的閒置時間,增加處理器單元的吞吐能力。執行緒池主要用來解決執行緒生命週期開銷問題和資源不足問題。通過對多個任務重用執行緒,執行緒建立的開銷就被分攤到了多個任務上了,而且由於在請求到達時執行緒已經存在,所以消除了執行緒建立所...
用 Python 實現的執行緒池
用 python 實現的執行緒池 用 python 實現的執行緒池 軟體技術 lhwork 發表於 2007 2 1 8 53 26 為了提高程式的效率,經常要用到多執行緒,尤其是io等需要等待外部響應的部分。執行緒的建立 銷毀和排程本身是有代價的,如果乙個執行緒的任務相對簡單,那這些時間和空間開銷...
用python實現的執行緒池
python3標準庫里自帶執行緒池threadpoolexecutor 和程序池processpoolexecutor 當然也可以自己寫乙個threadpool。coding utf 8 import queue import threading import sys import time imp...