Python多线程读取同一文件所有线程返回相同行问题求助
问题原因
- 全局变量仅初始化一次:你在启动所有线程前只执行了一次
email_pass_token(),三个存储账号信息的全局变量只被赋值1次,所有子线程运行的gen_acc函数都是读取这组固定值,自然所有线程输出内容完全相同。 - 全局变量在多线程场景下存在竞态风险:就算你把
email_pass_token()放到gen_acc里调用,多线程同时修改全局变量时也会出现值覆盖的问题,没法保证每个线程拿到的是自己选中的账号信息。 - 没有去重逻辑:原代码每次随机选行没有做去重标记,会出现不同线程选中同一行的情况,不符合你要「不同行」的需求。
- 冗余性能损耗:已经把文件内容读取为列表后,不需要遍历求和计算行数,直接取列表长度即可;拆分字符串的多步join操作也可以简化。
修复后的实现代码
import random import threading from typing import List # 预加载文件内容到内存,避免多线程重复读IO with open("testing/pokens.csv", "r", encoding="utf-8") as f: all_lines: List[str] = f.read().splitlines() # 预先打乱列表,后续直接按顺序取即可保证随机不重复 random.shuffle(all_lines) # 加锁保证取行操作线程安全 lock = threading.Lock() def gen_acc(): # 加锁取行,避免多线程同时取到同一索引的内容 with lock: if not all_lines: print("账号池已空") return # 弹出最后一个元素,执行效率最高 acc_str = all_lines.pop() # 拆分字段,maxsplit=2最多拆成3段,正好对应三个字段 email, pass2, token = acc_str.split(":", maxsplit=2) print(email, pass2, token) threads = [] num_thread = input("Threads: ") num_thread = int(num_thread) for i in range(num_thread): t = threading.Thread(target=gen_acc) threads.append(t) t.start() # 等待所有线程执行完成 for t in threads: t.join()
功能说明
- 取消了全局变量存储账号信息的逻辑,每个线程取到行后自行拆分处理,不会出现值冲突
- 预加载文件内容并打乱,通过加锁弹出元素的方式保证每个线程拿到的都是唯一不重复的行
- 优化了字符串拆分逻辑和行数计算逻辑,减少不必要的性能损耗
- 新增账号池空判断和线程等待逻辑,保证程序运行稳定性
内容的提问来源于stack exchange,提问作者Jarvn
相关产品推荐
相关产品推荐

