Python:使用threading实现一个简单线程池

 1 from threading import Lock, Semaphore, Thread
 2 from sqlite_conn_pool.connection_pool import ConnPool, ConnPoolRAII
 3  
 4  
 5 class ThreadPool:
 6     def __init__(self, actor_mode, connPool: ConnPool, thread_number, max_requests):
 7         self.__actor_mode = actor_mode  # 模型切换
 8         self.__thread_number = thread_number  # 线程池中的线程数
 9         self.__max_request = max_requests  # 请求队列中的最大请求数
10         self.__threads = []  # 线程池,其大小为self.__thread_number
11         self.__work_queue = []  # 请求队列
12         self.__connPool = connPool  # 数据库连接
13         self.__queue_state = Semaphore(value=0) # 信号量,初始值为0
14         self.__queue_locker = Lock()      # 请求队列锁
15         self.init()
16  
17     def init(self):
18         if (self.__thread_number <= 0) or (self.__max_request <= 0):
19             raise ValueError
20         for i in range(self.__thread_number):
21             t = WorkThread(self.__actor_mode, self.__connPool, self.__work_queue, self.__queue_state, self.__queue_locker)
22             self.__threads.append(t)
23  
24     # 清空线程
25     def __del__(self):
26         for t in self.__threads:
27             del t
28         self.__threads.clear()
29  
30     def append(self, request):
31         self.__queue_locker.acquire()       # 获取锁
32         if len(self.__work_queue) >= self.__max_request:
33             self.__queue_locker.release()       # 如果请求队列已满,则释放锁,并返回False
34             return False
35         self.__work_queue.append(request)   # 将请求对象置入请求队列
36         self.__queue_locker.release()       # 释放锁
37         self.__queue_state.release()        # 增加待处理任务
38         return True
39  
40     def run(self) -> None:
41         for t in self.__threads:
42             t.daemon=True                # 设置线程为守护线程
43             t.start()
44  
45  
46 class WorkThread(Thread):
47     def __init__(self, actor_mode, conn_pool:ConnPool, work_queue:list, queue_stat:Semaphore, queue_locker:Lock):
48         super(WorkThread, self).__init__()
49         self.__actor_mode = actor_mode
50         self.__conn_pool = conn_pool
51         self.__work_queue = work_queue
52         self.__queue_stat = queue_stat
53         self.__queue_locker = queue_locker
54  
55     def run(self) -> None:
56         while True:
57             self.__queue_stat.acquire()         # 消耗资源
58             self.__queue_locker.acquire()       # 加锁
59             if len(self.__work_queue) == 0:
60                 self.__queue_locker.release()   # 释放锁
61                 continue
62             request = self.__work_queue.pop(0)   # 弹出队首的任务
63             self.__queue_locker.release()       # 释放锁
64             if not request:
65                 continue
66             if 1 == self.__actor_mode:
67                 # do something
68                 pass
69             else:
70                 conn = ConnPoolRAII(self.__conn_pool)
71                 # do something
72                 request.process(conn)       # 事务处理
73                 del conn

 

posted on 2020-08-17 15:01  旭、  阅读(830)  评论(0)    收藏  举报

导航