You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python删除文件行后程序内未实时更新,无需重启如何实现?

问题根因
  • 内存中的账号列表self.username_list仅在类初始化时从文件读取一次,后续修改磁盘文件不会自动同步到该内存变量
  • 任务队列self.userQ中缓存了历史账号数据,且队列重载方法reloadQ是从已过时的self.username_list读取数据,因此已删除的账号仍然会被程序调用
修复方案

执行删除文件操作后,同步更新内存里的账号列表,同时清理队列中的残留旧数据,操作共享变量时加互斥锁避免多线程并发异常。修正后的代码如下:

from threading import Lock
from queue import Queue

class auto_claimer:
    def __init__(self) -> None:
        self.mutex = Lock() 
        self.userQ = Queue()
        # 初始化加载数据抽成公共方法,避免重复代码
        self.load_username_from_file()
        self.reloadQ()

    def load_username_from_file(self):
        """从磁盘文件加载最新的账号列表到内存"""
        with open("database.txt", "r") as f:
            self.username_list = [user.replace("\n", "") for user in f.readlines()]

    def reloadQ(self):
        # 加锁保护队列和账号列表的并发操作
        with self.mutex:
            # 先清空队列旧数据
            while not self.userQ.empty():
                self.userQ.get()
            # 加载最新账号到队列
            for i in self.username_list:
                self.userQ.put(i)

    def Queue(self):
        while True:
            if self.userQ.qsize() < len(self.username_list) / 2:
                self.reloadQ()

    def delete(self, item):
        # 先更新磁盘文件
        with open("database.txt", "r") as f:
            lines = f.readlines()
        with open("database.txt", "w") as f:
            for line in lines:
                if line.strip("\n") != item:
                    f.write(line)
        print("Successfully removed {} from the text file".format(item))
        # 同步更新内存账号列表,并重载队列
        self.load_username_from_file()
        self.reloadQ()
关键修改说明
  • 抽离公共的文件加载方法load_username_from_file,初始化和删除后都调用该方法,保证内存数据和磁盘文件一致
  • 重载队列时先清空旧的残留数据,再加载最新的账号列表
  • 所有操作共享变量(账号列表、队列)的逻辑都加互斥锁保护,避免多线程场景下的数据错乱
  • 删除操作执行完文件写入后,立即触发内存数据更新和队列重载,实现数据实时生效

内容的提问来源于stack exchange,提问作者akemi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 14:27:03