在使用多线程的过程中,一旦任务数量过多,如果不对派生出来的子线程做出限制的话,多线程极有可能会拉低程序的性能,这时,我们需要维护一个固定数量的线程,也就是线程池的概念
实现线程池的思路:
- 设置线程池的容量
- 每取走一个线程,在线程池中就减少一个线程
- 每个子线程的任务执行完毕,把自己的线程配额放回线程池中
- 当线程池中的线程全部分配完毕,新的任务需要等待获取线程池中的线程
基于以上的需求,我们可以通过队列来实现线程池的功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| import queue import threading import time
class ThreadPool: def __init__(self, maxsize=5): self.maxsize = maxsize
self.q = queue.Queue(maxsize)
for i in range(maxsize): self.q.put(threading.Thread)
def get_thread(self): return self.q.get()
def add_thread(self): self.q.put(threading.Thread)
def task(arg, pool): """接收了一个线程池对象""" print(arg) time.sleep(1)
pool.add_thread()
if __name__ == '__main__': pool = ThreadPool(5)
for i in range(59):
t = pool.get_thread()
o = t(target=task, args=(i, pool,))
o.start()
|