Python脚本多线程实现:如何避免函数任务重复执行
Python多线程协同处理任务避免重复执行的解决方案
你的代码问题在于每个线程都会完整执行request函数里的双重循环——所有u()和p()的组合任务会被每个线程都跑一遍,自然会重复处理。要实现多线程协同分工、无重复执行,核心是用线程安全的任务队列来统一管理待处理任务,让每个线程从队列里取任务处理,直到队列为空。
具体修改步骤
1. 导入必要模块
首先导入Python内置的线程安全队列模块,以及其他需要的依赖:
import queue import threading import requests
2. 预生成所有任务并放入队列
先把所有需要处理的appid任务提前生成好,存入线程安全队列,确保每个任务只被创建一次:
# 假设base_url、proxy、u()、p()这些变量/函数已提前定义 task_queue = queue.Queue() # 遍历生成所有待处理的appid任务,加入队列 for n in u(): for p in p(): appid = n + '&insert=' + p task_queue.put(appid)
3. 修改request函数为队列取任务模式
把原来的遍历任务逻辑改成从队列中获取任务,处理完一个再取下一个,直到队列清空:
def request(task_queue): while not task_queue.empty(): try: # 非阻塞式获取任务,避免队列空时线程卡住 appid = task_queue.get_nowait() url = f"{base_url}{appid}" print(url) response = requests.get(url, proxies=proxy) unformatted_data = response.json() # 处理响应结果(注意确保name、linec变量可正确访问,必要时可作为参数传入) if "wrong" in str(response.content): print(f"{name}:{linec}=Salah") elif "success" in str(response.content): print(f"{name}:{linec}=Sukses") else: print(str(unformatted_data)) # 标记当前任务已完成,用于后续队列的join()等待 task_queue.task_done() except queue.Empty: # 队列为空时退出循环 break
4. 启动并管理多线程
创建指定数量的线程,将任务队列作为参数传入,然后等待所有线程执行完成:
threads = [] thread_count = 2 # 你需要的线程数量 # 创建并启动线程 for _ in range(thread_count): t = threading.Thread(target=request, args=(task_queue,)) t.start() threads.append(t) # 等待所有线程执行完毕 for t in threads: t.join() # 等待队列中所有任务都被处理完成 task_queue.join()
关键说明
- 线程安全队列:
queue.Queue内部实现了锁机制,多个线程同时调用get()不会出现重复获取同一任务的情况,保证任务分配的唯一性。 - 任务完成标记:
task_done()和join()配合使用,能确保所有放入队列的任务都被处理完毕后程序才会结束。 - 非阻塞取任务:用
get_nowait()可以避免线程在队列空时一直阻塞,也可以用get(timeout=1)设置超时时间,效果类似。
内容的提问来源于stack exchange,提问作者Vickyz Setiawan
相关产品推荐
相关产品推荐

