当前位置: 首页 > news >正文

python 线程池顺序执行

在Python中,线程池(ThreadPoolExecutor)默认是并发执行任务的,但若需要实现任务的顺序执行(按提交顺序执行或按结果顺序处理),可以通过以下方案实现:


方案一:强制单线程(伪顺序执行)
将线程池的最大工作线程数设为1,任务会按提交顺序依次执行(但失去了并发意义):

from concurrent.futures import ThreadPoolExecutordef task(n):return f"Task {n} completed"with ThreadPoolExecutor(max_workers=1) as executor:  # 单线程futures = [executor.submit(task, i) for i in range(1, 6)]for future in futures:print(future.result())

方案二:按提交顺序获取结果
保持并发执行,但按任务提交顺序获取结果(若任务完成顺序不确定):

from concurrent.futures import ThreadPoolExecutordef task(n):import time, randomtime.sleep(random.uniform(0, 1))  # 模拟随机耗时return f"Task {n} completed"with ThreadPoolExecutor() as executor:# 提交任务并按顺序存储 Future 对象futures = [executor.submit(task, i) for i in range(1, 6)]# 按提交顺序逐个获取结果(会阻塞直到对应任务完成)for future in futures:print(future.result())  # 输出顺序始终是 1,2,3,4,5

方案三:任务间依赖控制
若任务需要严格按顺序执行(前一个任务完成后才能执行下一个),使用同步锁:

from concurrent.futures import ThreadPoolExecutor
import threadinglock = threading.Lock()
current_step = 0def sequential_task(n):global current_stepwhile True:with lock:if n == current_step + 1:print(f"Executing Task {n}")current_step = nbreakwith ThreadPoolExecutor(max_workers=5) as executor:executor.map(sequential_task, range(1, 6))  # 严格按 1→2→3→4→5 执行

方案四:队列顺序消费
使用队列(Queue)控制任务执行顺序:

from concurrent.futures import ThreadPoolExecutor
import queuedef worker(q):while not q.empty():task_id = q.get()print(f"Processing Task {task_id}")q.task_done()task_queue = queue.Queue()
for i in range(1, 6):task_queue.put(i)with ThreadPoolExecutor() as executor:# 启动多个线程消费队列(实际按队列顺序执行)for _ in range(3):  # 3个工作线程executor.submit(worker, task_queue)task_queue.join()  # 等待所有任务完成

适用场景总结

方案特点适用场景
单线程池简单但无并发调试或资源受限环境
顺序获取结果并发执行,顺序处理结果结果需按提交顺序处理(如日志写入)
任务间依赖锁严格顺序执行任务有前后依赖关系
队列消费动态任务按队列顺序执行生产者-消费者模型

根据需求选择最合适的方法,通常方案二(顺序获取结果)能满足大多数场景。

http://www.xdnf.cn/news/190603.html

相关文章:

  • 二叉树的所有路径(回溯算法基础)
  • 深度学习---Pytorch概览
  • 3D模型文件格式之《DAE格式介绍》
  • [LeetCode 438/567] 找到字符串中所有字母异位词/字符串的排列(滑动窗口)
  • tsconfig.json的配置项介绍
  • 云原生周刊:Kubernetes v1.33 正式发布
  • 用JavaScript构建3D程序
  • 2025系统架构师---论微服务架构及其应用
  • Linux中的系统延时任务和定时任务与时间同步服务和构建时间同步服务器
  • 老电脑优化全知道(包括软件和硬件优化)
  • 【爬虫】一文掌握 adb 的各种指令(adb备忘清单)
  • 【Mybatis】Mybatis基础
  • 集合框架篇-java集合家族汇总
  • 【3D基础】深入解析OBJ与MTL文件格式:Blender导出模型示例及3D开发应用
  • 【KWDB 创作者计划】_企业数据管理的利刃:技术剖析与应用实践
  • CMake:设置编译C++的版本
  • 【北京】昌平区某附小v3700存储双控故障维修案例
  • 分布式链路追踪理论
  • 【Axure视频教程】手电筒效果
  • 【题解-Acwing】867. 分解质因数
  • 【蒸馏(5)】DistillBEV代码分析
  • FPGA-DDS信号发生器
  • 3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目
  • 数据可视化
  • 【C++教程】三目运算符
  • Day8 鼠标控制与32位模式切换
  • AIGC重构元宇宙:从内容生成到沉浸式体验的技术革命
  • 临床试验概述:从定义到实践的关键要素
  • R 语言科研绘图第 43 期 --- 桑基图-冲击
  • 软件设计师速通其一:计算机内部数据表示