完善功能:数据库超时等待
This commit is contained in:
71
Thread.py
71
Thread.py
@@ -1,20 +1,60 @@
|
||||
import pymysql, threading
|
||||
import pymysql, threading, time
|
||||
from queue import Queue
|
||||
from Tools import config, download_image, Hash, remove_image, compare, Image, imagehash, os, logging, clean_image
|
||||
|
||||
Myconn = pymysql.connect(
|
||||
host=str(config['mysql']['host']),
|
||||
user=str(config['mysql']['user']),
|
||||
password=str(config['mysql']['password']),
|
||||
database=str(config['mysql']['database'])
|
||||
)
|
||||
class MySQLConnectionPool:
|
||||
def __init__(self):
|
||||
self.pool_size = int(config['mysql']['pool_size'])
|
||||
self.pool = Queue(maxsize=self.pool_size)
|
||||
self.host = str(config['mysql']['host'])
|
||||
self.user = str(config['mysql']['user'])
|
||||
self.password = str(config['mysql']['password'])
|
||||
self.database = str(config['mysql']['database'])
|
||||
|
||||
# 初始化连接池
|
||||
for _ in range(self.pool_size):
|
||||
conn = pymysql.connect(
|
||||
host=self.host,
|
||||
user=self.user,
|
||||
password=self.password,
|
||||
database=self.database,
|
||||
cursorclass=pymysql.cursors.DictCursor
|
||||
)
|
||||
self.pool.put(conn)
|
||||
|
||||
import time
|
||||
|
||||
def get_connection(self, max_retries=5, wait_time=1):
|
||||
"""获取一个数据库连接,如果连接池为空,继续尝试直到能够获取连接"""
|
||||
retries = 0
|
||||
while retries < max_retries:
|
||||
if not self.pool.empty():
|
||||
return self.pool.get()
|
||||
else:
|
||||
retries += 1
|
||||
print(f"连接池中没有可用连接,正在尝试第 {retries} 次连接...")
|
||||
time.sleep(wait_time) # 等待指定时间再尝试
|
||||
|
||||
raise Exception("连接池中没有可用连接,已尝试多次连接")
|
||||
|
||||
def release_connection(self, conn):
|
||||
"""释放数据库连接"""
|
||||
if conn:
|
||||
self.pool.put(conn)
|
||||
|
||||
def close_all(self):
|
||||
"""关闭所有连接"""
|
||||
while not self.pool.empty():
|
||||
conn = self.pool.get()
|
||||
conn.close()
|
||||
|
||||
exit_flag = False
|
||||
|
||||
class UploadThread(threading.Thread):
|
||||
def __init__(self, uploadqqnumber):
|
||||
def __init__(self, uploadqqnumber, pool):
|
||||
super().__init__()
|
||||
self.uploadqqnumber = uploadqqnumber
|
||||
self.conn = Myconn
|
||||
self.pool = pool
|
||||
self.conn = pool.get_connection()
|
||||
|
||||
|
||||
def run(self):
|
||||
@@ -23,24 +63,23 @@ class UploadThread(threading.Thread):
|
||||
Hash(self.conn).tomysql(self.uploadqqnumber)
|
||||
logging.info(f'上传成功: {self.uploadqqnumber}')
|
||||
remove_image(self.uploadqqnumber)
|
||||
self.conn.close()
|
||||
self.pool.release_connection(self.conn)
|
||||
|
||||
|
||||
class FindThread(threading.Thread):
|
||||
def __init__(self, TargetImageHash):
|
||||
def __init__(self, TargetImageHash, pool):
|
||||
super().__init__()
|
||||
self.TargetImageHash = TargetImageHash
|
||||
self.conn = Myconn
|
||||
self.pool = pool
|
||||
self.conn = pool.get_connection()
|
||||
|
||||
|
||||
def run(self):
|
||||
global exit_flag
|
||||
logging.debug(f'我是查询线程{self.TargetImageHash}')
|
||||
res = Hash(self.conn).getqq(self.TargetImageHash)
|
||||
if res != 'error':
|
||||
logging.info(f'查询成功,QQ号是: {res}')
|
||||
exit_flag = True
|
||||
self.conn.close()
|
||||
self.pool.release_connection(self.conn)
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user