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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:15:08