@@ -404,28 +404,30 @@ async def acquire(
404404 """按最小忙碌度获取一个可用匿名会话。"""
405405 excluded = exclude_user_ids or set ()
406406
407- while True :
408- candidates = self ._list_valid_sessions (exclude_user_ids = excluded )
409- if candidates :
410- session = min (
411- candidates ,
412- key = lambda item : (item .active_requests , item .created_at ),
413- )
414- with self ._lock :
415- current = self ._sessions .get (session .user_id )
416- if current and current .valid and current .user_id not in excluded :
417- current .active_requests += 1
418- return current
419-
420- new_session = await self ._create_session ()
421- if new_session .user_id in excluded :
422- await self ._delete_all_chats (new_session )
423- continue
407+ # 使用容量锁防止并发创建重复会话
408+ async with self ._capacity_lock :
409+ while True :
410+ candidates = self ._list_valid_sessions (exclude_user_ids = excluded )
411+ if candidates :
412+ session = min (
413+ candidates ,
414+ key = lambda item : (item .active_requests , item .created_at ),
415+ )
416+ with self ._lock :
417+ current = self ._sessions .get (session .user_id )
418+ if current and current .valid and current .user_id not in excluded :
419+ current .active_requests += 1
420+ return current
421+
422+ new_session = await self ._create_session ()
423+ if new_session .user_id in excluded :
424+ await self ._delete_all_chats (new_session )
425+ continue
424426
425- with self ._lock :
426- new_session .active_requests = 1
427- self ._sessions [new_session .user_id ] = new_session
428- return new_session
427+ with self ._lock :
428+ new_session .active_requests = 1
429+ self ._sessions [new_session .user_id ] = new_session
430+ return new_session
429431
430432 def release (self , user_id : str ):
431433 """释放一个匿名会话占用。"""
0 commit comments