feat: session过期操作 #2

This commit is contained in:
Rock Chin
2022-12-09 16:17:50 +08:00
parent 9b77a2221b
commit 39befeee30
2 changed files with 35 additions and 2 deletions

View File

@@ -90,6 +90,11 @@ class DatabaseManager:
update `sessions` set `status` = 'on_going' where `name` = '{}' and `create_timestamp` = {} update `sessions` set `status` = 'on_going' where `name` = '{}' and `create_timestamp` = {}
""".format(session_name, create_timestamp)) """.format(session_name, create_timestamp))
def set_session_expired(self, session_name: str, create_timestamp: int):
self.cursor.execute("""
update `sessions` set `status` = 'expired' where `name` = '{}' and `create_timestamp` = {}
""".format(session_name, create_timestamp))
# 记载还没过期的session数据 # 记载还没过期的session数据
def load_valid_sessions(self) -> dict: def load_valid_sessions(self) -> dict:
# 从数据库中加载所有还没过期的session # 从数据库中加载所有还没过期的session

View File

@@ -1,6 +1,8 @@
import logging import logging
import threading
import time import time
import config
import pkg.openai.manager import pkg.openai.manager
import pkg.database.manager import pkg.database.manager
@@ -65,11 +67,31 @@ class Session:
self.name = name self.name = name
self.create_timestamp = int(time.time()) self.create_timestamp = int(time.time())
self.last_interact_timestamp = int(time.time()) self.last_interact_timestamp = int(time.time())
self.schedule()
def schedule(self):
threading.Thread(target=self.expire_check_timer_loop, args=(self.create_timestamp,)).start()
# 检查session是否已经过期
def expire_check_timer_loop(self, create_timestamp: int):
while True:
time.sleep(60)
# 不是此session已更换退出
if self.create_timestamp != create_timestamp:
return
if int(time.time()) - self.last_interact_timestamp > config.session_expire_time:
logging.info('session {} 已过期'.format(self.name))
self.reset(expired=True, schedule_new=False)
# 删除此session
global sessions
del sessions[self.name]
return
# 请求回复 # 请求回复
# 这个函数是阻塞的 # 这个函数是阻塞的
def append(self, text: str) -> str: def append(self, text: str) -> str:
self.prompt += self.user_name + ':' + text + '\n' + self.bot_name + ':'
self.last_interact_timestamp = int(time.time()) self.last_interact_timestamp = int(time.time())
# 向API请求补全 # 向API请求补全
@@ -134,16 +156,22 @@ class Session:
db_inst.persistence_session(subject_type, subject_number, self.create_timestamp, self.last_interact_timestamp, db_inst.persistence_session(subject_type, subject_number, self.create_timestamp, self.last_interact_timestamp,
self.prompt) self.prompt)
def reset(self, explicit: bool = False): def reset(self, explicit: bool = False, expired: bool = False, schedule_new: bool = True):
if self.prompt != '': if self.prompt != '':
self.persistence() self.persistence()
if explicit: if explicit:
pkg.database.manager.get_inst().explicit_close_session(self.name, self.create_timestamp) pkg.database.manager.get_inst().explicit_close_session(self.name, self.create_timestamp)
if expired:
pkg.database.manager.get_inst().set_session_expired(self.name, self.create_timestamp)
self.prompt = '' self.prompt = ''
self.create_timestamp = int(time.time()) self.create_timestamp = int(time.time())
self.last_interact_timestamp = int(time.time()) self.last_interact_timestamp = int(time.time())
self.just_switched_to_exist_session = False self.just_switched_to_exist_session = False
if schedule_new:
self.schedule()
# 将本session的数据库状态设置为on_going # 将本session的数据库状态设置为on_going
def set_ongoing(self): def set_ongoing(self):
pkg.database.manager.get_inst().set_session_ongoing(self.name, self.create_timestamp) pkg.database.manager.get_inst().set_session_ongoing(self.name, self.create_timestamp)