Python執行緒池實現

2021-06-21 20:17:42 字數 2708 閱讀 1259

執行緒池:
#-*- coding: gb2312 -*-

'''created on apr 10, 2014

@author: liyunfeng

@see: 執行緒池模組

'''import queue

import sys

import threading

from time import ctime

class threadpool(threading.thread):

def __init__(self, workqueue, resultqueue, timeout = 0.5, **kwds):

threading.thread.__init__(self, **kwds)

self.setdaemon(true) #建立該執行緒的主線程結束時,kill子執行緒

self.workqueue=workqueue #工作佇列

self.resultqueue=resultqueue #結果佇列

self.timeout=timeout

def run(self):

while true:

try:

callable, args, kwds=self.workqueue.get(timeout = self.timeout)

print ctime(),self.getname(),'the task number of:',args[0]

res=callable(*args, **kwds)

self.resultqueue.put(res)#將結果放入到結果的佇列裡面

except queue.empty:#如果去工作佇列取函式和引數的時候,隊列為空的話,跳出結束迴圈

break

except:

print ctime(),self.getname(), sys.exc_info()[:2]

'''執行緒池管理'''

class threadpoolmanager(object):

__instance = none

__lock = threading.rlock()

def __init__(self):

pass

'''單例'''

@classmethod

def getinstance(self):

#加鎖self.__lock.acquire()

if not self.__instance:

self.__instance = super(threadpoolmanager,self).__new__(self)

self.__lock.release()

return self.__instance

'''初始化執行緒池'''

def initpool(self, num_of_workers = 5, timeout = 0.5):

self.workqueue=queue.queue()#建立工作佇列

self.resultqueue=queue.queue()#建立結果佇列

self.workers=#執行緒容器

self.timeout=timeout

for i in range(num_of_workers):

worker=threadpool(self.workqueue, self.resultqueue, self.timeout)#執行緒就緒

worker.setname("task-"+str(i+1))#給每個執行緒設定固定的名字

self.start()

'''開啟執行緒'''

def start(self):

for t in self.workers:

t.start()

print ctime(),'all task is start,of ',len(self.workers)

'''等待所有執行緒完成'''

def wait_complete(self):

''' ...then, wait for each of them to terminate'''

while len(self.workers):

worker=self.workers.pop()#取出乙個工作執行緒

worker.join()#阻塞在此,執行緒結束後才往後走。這裡並沒有啟動執行緒,執行緒一被建立就已經啟動了

if worker.isalive() and not self.workqueue.empty():#isalive方法檢視執行緒是否執行

print ctime(),"all task is complete!"

print ''

'''加入工作佇列,第二個引數是函式,第三個引數是函式的引數'''

def add_task(self, callable, *args, **kwds):

self.workqueue.put((callable, args, kwds))#必須按元組的方式新增進去

'''通過引數來獲得從佇列中獲得特定的結果'''

def get_result(self, *args, **kwds):

return self.resultqueue.get(*args, **kwds)

Python實現執行緒池

最近在做一些文字處理方面的事情,考慮到程式利用併發性可以提高執行效率 不糾結特殊反例 於是入圍的idea如使用多程序或多執行緒達到期望的目標,對於程序或執行緒的建立是有代價的,那麼我們是否可以實現乙個執行緒池來達到已建立的執行緒反覆使用從而使代價降低到最小呢?當然可以,要想建立乙個執行緒池,那麼必須...

python實現執行緒池

usr bin env python coding utf 8 import queue import threading import time class workmanager object def init self,work num 1000,thread num 10 work num是...

python多執行緒執行緒池實現

在python中多執行緒可以使用threading來實現,但實際使用時考慮效能等,大多會使用到執行緒池,下面就是基於python2和python3來說明下執行緒池的使用。import time def testthread fl time.sleep 1 print print fl return ...