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