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

Python多线程问题:用4线程显示50组邮箱密码时重复输出

解决4个线程处理50组邮箱密码列表的重复打印问题

你的代码出现重复打印的核心问题是逻辑嵌套错误:

  • 外层循环遍历每个列表元素,内层又循环4次,每次都用同一个my_list[j]创建线程,等于单个元素被4个线程重复执行打印,这就是重复输出的根源。
  • 每次内层循环都重置threads = [],最后threads里只保留了最后一个创建的线程,join操作根本没起到等待所有线程完成的作用。

下面是两种正确的实现方式:

方法一:自定义线程类,分块分配任务

先补全myThread类,再将列表分成4个部分,每个线程负责处理一块数据:

import threading

class myThread(threading.Thread):
    def __init__(self, data_chunk):
        threading.Thread.__init__(self)
        self.data_chunk = data_chunk
    
    def run(self):
        for ep in self.data_chunk:
            email, pass_email = ep.split('|')
            print(f"邮箱: {email}, 密码: {pass_email}")

my_list = ["mail|pass", "Mail2|Pass@"] + [f"Mail{i}|Pass{i}" for i in range(3, 51)]

# 将列表分成4块,最后一块包含剩余所有元素
chunk_size = len(my_list) // 4
chunks = []
for i in range(4):
    start = i * chunk_size
    end = start + chunk_size if i != 3 else len(my_list)
    chunks.append(my_list[start:end])

# 创建并启动线程
threads = []
for chunk in chunks:
    thread = myThread(chunk)
    thread.start()
    threads.append(thread)

# 等待所有线程执行完毕
for t in threads:
    t.join()

方法二:使用线程池(更简洁)

借助concurrent.futures.ThreadPoolExecutor自动管理线程,无需手动分块:

from concurrent.futures import ThreadPoolExecutor

def print_account(ep):
    email, pass_email = ep.split('|')
    print(f"邮箱: {email}, 密码: {pass_email}")

my_list = ["mail|pass", "Mail2|Pass@"] + [f"Mail{i}|Pass{i}" for i in range(3, 51)]

# 创建包含4个线程的线程池,自动分配任务
with ThreadPoolExecutor(max_workers=4) as executor:
    executor.map(print_account, my_list)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:15:39