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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:26:27