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
相关产品推荐
相关产品推荐

