feat: Implement account pooling for concurrent scheduling and introduce a new permissions module.
This commit is contained in:
@@ -12,6 +12,61 @@ _ACCOUNTS_FILE = Path(__file__).parent / "accounts.txt"
|
||||
_STATS_FILE = Path(__file__).parent / "stats.json"
|
||||
_lock = threading.Lock()
|
||||
|
||||
# ====== 账号池(并发调度)======
|
||||
# _busy 记录当前被占用的账号行(原始字符串)
|
||||
_busy: set[str] = set()
|
||||
|
||||
|
||||
def acquire(n: int = 0) -> list[str]:
|
||||
"""从空闲账号中获取最多 n 个,标记为占用。
|
||||
|
||||
Args:
|
||||
n: 需要的账号数。0 表示尽量获取所有空闲账号(至少 1 个)。
|
||||
|
||||
Returns:
|
||||
被获取的账号行列表(可能少于 n),为空表示没有空闲账号。
|
||||
"""
|
||||
with _lock:
|
||||
try:
|
||||
with open(_ACCOUNTS_FILE, "r", encoding="utf-8") as f:
|
||||
all_lines = [line.strip() for line in f if line.strip()]
|
||||
except FileNotFoundError:
|
||||
return []
|
||||
|
||||
free = [line for line in all_lines if line not in _busy]
|
||||
if not free:
|
||||
return []
|
||||
|
||||
if n <= 0:
|
||||
# 获取全部空闲
|
||||
acquired = free
|
||||
else:
|
||||
acquired = free[:n]
|
||||
|
||||
_busy.update(acquired)
|
||||
return acquired
|
||||
|
||||
|
||||
def release(lines: list[str]) -> None:
|
||||
"""释放指定账号,标记为空闲。"""
|
||||
with _lock:
|
||||
for line in lines:
|
||||
_busy.discard(line)
|
||||
|
||||
|
||||
def pool_status() -> dict:
|
||||
"""返回账号池状态。"""
|
||||
with _lock:
|
||||
try:
|
||||
with open(_ACCOUNTS_FILE, "r", encoding="utf-8") as f:
|
||||
all_lines = [line.strip() for line in f if line.strip()]
|
||||
except FileNotFoundError:
|
||||
all_lines = []
|
||||
|
||||
total = len(all_lines)
|
||||
busy = sum(1 for line in all_lines if line in _busy)
|
||||
return {"total": total, "busy": busy, "free": total - busy}
|
||||
|
||||
|
||||
# ====== 账号操作 ======
|
||||
|
||||
|
||||
Reference in New Issue
Block a user