用python建立執行緒池

2021-08-02 14:25:27 字數 2117 閱讀 9350

物件導向開發中,大家知道建立和銷毀物件是很費時間的,因為建立乙個物件要獲取記憶體資源或者其它更多資源。無節制的建立和銷毀執行緒是一種極大的浪費。那我們可不可以把執行完任務的執行緒不銷毀而重複利用呢?彷彿就是把這些執行緒放進乙個池子,一方面我們可以控制同時工作的執行緒數量,一方面也避免了建立和銷毀產生的開銷。

執行緒在官方文件沒有明確說明,但是是在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...