首页 > 代码库 > 十五篇、自定义线程池之简单的线程池

十五篇、自定义线程池之简单的线程池

 1 二、    #!/usr/bin/env python
 2 #-*- coding:utf-8 -*-
 3 import threading
 4 import queue
 5 import time
 6 
 7 class ThreadPool(object):
 8     def __init__(self,max_num = 20):
 9         self.queue = queue.Queue(max_num) #创建一个最大长度为20的队列
10         for i in range(max_num):  #往队列里面创建了20个位置的队列,每个位置放了一个Thread类名,指向内存地址相同
11             self.queue.put(threading.Thread)
12 
13     def get_thread(self):
14         return self.queue.get()#这里的self指代的就是上面的这个队列
15 
16     def add_thread(self):
17         self.queue.put(threading.Thread)
18 
19 def func(pool,a1):
20     time.sleep(2)
21     print(a1)
22     pool.add_thread()
23 
24 
25 p = ThreadPool(10)  #只要创建对象就会执行构造方法  在队列中创建类
26 for i in range(100):
27     #获得类
28     ret = p.get_thread()  #这里ret就等于类名threading.Thread
29     t = ret(target=func,args=(p,i,))  #这里t 等于threading.Thread(target=func),相当于创建了一个线程
30     t.start()  #相当于开始了执行线程。

上面执行流程:

1、首先创建一个队列,这个队列的最大长度为20

2、在每个队列里面放入threading.Thread类

3、给队列添加两个方法,方法一是取队列中的类;方法二 往队列中放置类

4、p = ThreadPool(10)   创建对象,并且指定每次执行多少个对象

5、去出类创建线程,并且开始执行func方法,执行完毕之后再把这个类放入到队列中

缺点:

从队列中拿出来类,创建了线程对象,执行完毕之后,这个线程对象并没有放入到队列之中,而是把类放入到了队列之中,线程放入到了内存之中,等待垃圾回收机制回收

 

 

 

 

 

 

 

 

 

 

一、      #!/usr/bin/env python
#-*- coding:utf-8 -*-
import threading
import queue
import time

class ThreadPool(object):
   
def __init__(self,max_num = 20):
       
self.queue = queue.Queue(max_num) #创建一个最大长度为20的队列
       
for i in range(max_num)#往队列里面创建了20个位置的队列,每个位置放了一个Thread类名,指向内存地址相同
           
self.queue.put(threading.Thread)

   
def get_thread(self):
       
return self.queue.get()#这里的self指代的就是上面的这个队列

   
def add_thread(self):
       
self.queue.put(threading.Thread)

def func(pool,a1):
   
time.sleep(2)
   
print(a1)
   
pool.add_thread()


p
= ThreadPool(10#只要创建对象就会执行构造方法  在队列中创建类
for i in range(100):

        #获得类
   
ret = p.get_thread()  #这里ret就等于类名threading.Thread
   
t = ret(target=func,args=(p,i,))  #这里t 等于threading.Thread(target=func),相当于创建了一个线程
   
t.start()  #相当于开始了执行线程。这里注意,执行完毕之后要把这个线程放回到线程池里面

十五篇、自定义线程池之简单的线程池