Python實現線程池
最近在做一些文本處理方面的事情,考慮到程序利用并發性可以提高執行效率(不糾結特殊反例),于是入圍的Idea如使用多進程或多線程達到期望的目標,對于進程或線程的創建是有代價的,那么我們是否可以實現一個線程池來達到已創建的線程反復使用從而使代價降低到最小呢?
當然可以,要想創建一個線程池,那么必須得有個容器來模擬“池”,在Python中,隊列這樣的數據結構就可以幫我們解決“池”這個問題,然而隨之引來的多線程之間數據處理同步問題,好在Python中有個Queue模塊幫我們解決了這一棘手的問題,那么我們就可以實現一個線程池的雛形了。
- # !/usr/bin/env python
- # -*- coding:utf-8 -*-
- import Queue
- import threading
- import time
- class WorkManager(object):
- def __init__(self, work_num=1000,thread_num=2):
- self.work_queue = Queue.Queue()
- self.threads = []
- self.__init_work_queue(work_num)
- self.__init_thread_pool(thread_num)
- """
- 初始化線程
- """
- def __init_thread_pool(self,thread_num):
- for i in range(thread_num):
- self.threads.append(Work(self.work_queue))
- """
- 初始化工作隊列
- """
- def __init_work_queue(self, jobs_num):
- for i in range(jobs_num):
- self.add_job(do_job, i)
- """
- 添加一項工作入隊
- """
- def add_job(self, func, *args):
- self.work_queue.put((func, list(args)))#任務入隊,Queue內部實現了同步機制
- """
- 等待所有線程運行完畢
- """
- def wait_allcomplete(self):
- for item in self.threads:
- if item.isAlive():item.join()
- class Work(threading.Thread):
- def __init__(self, work_queue):
- threading.Thread.__init__(self)
- self.work_queue = work_queue
- self.start()
- def run(self):
- #死循環,從而讓創建的線程在一定條件下關閉退出
- while True:
- try:
- do, args = self.work_queue.get(block=False)#任務異步出隊,Queue內部實現了同步機制
- do(args)
- self.work_queue.task_done()#通知系統任務完成
- except:
- break
- #具體要做的任務
- def do_job(args):
- time.sleep(0.1)#模擬處理時間
- print threading.current_thread(), list(args)
- if __name__ == '__main__':
- start = time.time()
- work_manager = WorkManager(10000, 10)#或者work_manager = WorkManager(10000, 20)
- work_manager.wait_allcomplete()
- end = time.time()
- print "cost all time: %s" % (end-start)
# !/usr/bin/env python # -*- coding:utf-8 -*- import Queue import threading import time class WorkManager(object): def __init__(self, work_num=1000,thread_num=2): self.work_queue = Queue.Queue() self.threads = [] self.__init_work_queue(work_num) self.__init_thread_pool(thread_num) """ 初始化線程 """ def __init_thread_pool(self,thread_num): for i in range(thread_num): self.threads.append(Work(self.work_queue)) """ 初始化工作隊列 """ def __init_work_queue(self, jobs_num): for i in range(jobs_num): self.add_job(do_job, i) """ 添加一項工作入隊 """ def add_job(self, func, *args): self.work_queue.put((func, list(args)))#任務入隊,Queue內部實現了同步機制 """ 等待所有線程運行完畢 """ def wait_allcomplete(self): for item in self.threads: if item.isAlive():item.join() class Work(threading.Thread): def __init__(self, work_queue): threading.Thread.__init__(self) self.work_queue = work_queue self.start() def run(self): #死循環,從而讓創建的線程在一定條件下關閉退出 while True: try: do, args = self.work_queue.get(block=False)#任務異步出隊,Queue內部實現了同步機制 do(args) self.work_queue.task_done()#通知系統任務完成 except: break #具體要做的任務 def do_job(args): time.sleep(0.1)#模擬處理時間 print threading.current_thread(), list(args) if __name__ == '__main__': start = time.time() work_manager = WorkManager(10000, 10)#或者work_manager = WorkManager(10000, 20) work_manager.wait_allcomplete() end = time.time() print "cost all time: %s" % (end-start)
2次開啟不同的線程數運行結果如下:
- #work_manager = WorkManager(10000, 10)
- cost all time: 100.641790867(單位:秒)
- #work_manager = WorkManager(10000, 20)
- cost all time:50.5233478546(單位:秒)
#work_manager = WorkManager(10000, 10) cost all time: 100.641790867(單位:秒) #work_manager = WorkManager(10000, 20) cost all time:50.5233478546(單位:秒)
上面實現了線程池的雛形,展現了基本原理,當然要想成為通用的API需要做很多的工作,希望本文能夠起到拋磚引玉的效果。
本文由用戶 quguiliang 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!