首页/新闻资讯/正文详情

程序卡住了?多进程多线程让你的 Python“多任务并行“ 跑起来

发布时间:2026/11/5 7:55:52 来源:云帆数科 栏目:资讯中心
程序卡住了?多进程多线程让你的 Python“多任务并行“ 跑起来
程序运行慢很多时候是它 只肯一次干一件事。这篇老哥带你搞懂并发 / 并行、进程 / 线程让程序真正 多任务跑起来。一、并发 vs 并行并发Concurrency单个 CPU 轮流处理多个任务每个任务交替执行一段时间并行Parallelism多个 CPU 同时执行多个任务。二、多进程资源分配的基本单位进程是操作系统资源分配的基本单位 —— 一个正在运行的程序就是一个进程。每个进程有独立的内存空间一个进程崩溃不影响其他进程。用multiprocessing.Process创建进程。注意 Windows 上要加if __name__ __main__import time import multiprocessing def write_file(): with open(test.txt, a) as f: while True: f.write(hello world\n) f.flush() time.sleep(0.5) def read_file(): with open(test.txt, r) as f: while True: time.sleep(0.1) print(f.read(1)) if __name__ __main__: p1 multiprocessing.Process(targetwrite_file) p2 multiprocessing.Process(targetread_file) p1.start() # 启动 p2.start()Process 常用属性 / 方法name名称、pid进程号、start()启动、join([timeout])阻塞主进程等子进程、terminate()强制终止、is_alive()。自定义 Process 子类重写run()import os import multiprocessing class Worker(multiprocessing.Process): def run(self): print(进程id, os.getpid(), 父进程id, os.getppid()) if __name__ __main__: for i in range(5): p Worker() p.start()三、进程池批量管理子进程子进程太多就要用进程池 Pool。apply()同步阻塞、apply_async()异步不阻塞import os import time import multiprocessing def func(): for i in range(10): print(os.getpid(), i) time.sleep(0.5) if __name__ __main__: pool multiprocessing.Pool(process_num5) # 指定进程池大小 for p in range(5): pool.apply_async(func) # 非阻塞式提交 pool.close() # 关闭提交 pool.join() # 等待所有任务完成 print(end)四、进程间通信Queue进程间不共享全局变量各自独立内存要传数据得用Queue队列先进先出import time import random import multiprocessing def func1(queue): # 生产 while True: queue.put(random.randint(1, 50)) time.sleep(random.random()) def func2(queue): # 消费 while True: print( * queue.get()) if __name__ __main__: queue multiprocessing.Queue() p1 multiprocessing.Process(targetfunc1, args(queue,)) p2 multiprocessing.Process(targetfunc2, args(queue,)) p1.start(); p2.start() p1.join(); p2.join()进程池之间用Manager().Queue()通信queue multiprocessing.Manager().Queue() pool multiprocessing.Pool(2) pool.apply_async(func1, (queue,)) pool.apply_async(func2, (queue,))五、多线程任务调度的基本单位线程是任务调度和执行的基本单位。一个进程至少一个线程。和进程不同多线程之间可共享数据—— 但线程出错且没捕获会导致整个进程崩溃。用threading.Thread创建线程import time import threading def func(): while True: print(threading.current_thread().name, 0000) time.sleep(0.5) if __name__ __main__: t1 threading.Thread(targetfunc, name线程1) t2 threading.Thread(targetfunc, name线程2) t1.start() t2.start()线程池 ThreadPoolExecutor来自concurrent.futuresimport threading import time import concurrent.futures def func(): for i in range(6): print(threading.current_thread().name, f数据{i}) time.sleep(0.2) if __name__ __main__: with concurrent.futures.ThreadPoolExecutor(max_workers3) as executor: future1 executor.submit(func) # 提交任务返回 Future future2 executor.submit(func) future3 executor.submit(func) future1.result() # 取结果六、线程安全与互斥锁线程共享数据会有线程安全问题。看这个 3 个线程各把 g_num 加 1 十次 的例子期望 30import time import threading def func(): global g_num for _ in range(10): tmp g_num 1 time.sleep(0.01) # 故意加延迟 g_num tmp print(f{threading.current_thread().name}: {g_num}\n, end) if __name__ __main__: g_num 0 threads [threading.Thread(targetfunc, namef线程{i}) for i in range(3)] [t.start() for t in threads] [t.join() for t in threads] print(g_num) # 结果可能是 10而不是 30原因线程 A 在tmp g_num 1后休眠还没来得及把g_num tmpCPU 就切给线程 BB 读到的还是旧值。这就是线程不安全。互斥锁解决同一时刻只有一个线程能改共享数据。def func(): global g_num for _ in range(10): lock.acquire() # 获取锁 tmp g_num 1 time.sleep(0.01) g_num tmp lock.release() # 释放锁 print(f{threading.current_thread().name}: {g_num}\n, end) if __name__ __main__: g_num 0 lock threading.Lock() # 创建锁 threads [threading.Thread(targetfunc, namef线程{i}) for i in range(3)] [t.start() for t in threads] [t.join() for t in threads] print(g_num) # 30 正确了七、GILPython 的 全局解释器锁GILGlobal Interpreter Lock是 CPython 实现引入的一个锁同一时间只允许一个线程持有 Python 解释器的控制权所以多线程无法真正并行利用多核 CPU。CPU 密集型任务大量计算GIL 是性能瓶颈多线程没优势该用多进程I/O 密集型任务文件读写、网络请求线程在 I/O 等待时会释放 GIL其他线程可以执行多线程依然有效。一句话计算密集 → 多进程I/O 密集 → 多线程。老哥收尾进程线程的选择口诀进程独立内存、线程共享数据计算密集用多进程绕开 GILI/O 密集用多线程共享数据记得上互斥锁大量任务用池Pool / ThreadPoolExecutor。到这里Python 的 多任务 也打通了。下一篇讲网络编程—— 让程序能联网通信。有问题随时回来找老哥。

相关推荐

跨平台移动自动化测试框架揭秘
跨平台移动自动化测试框架揭秘

拼课, 也就是大家所说的拼团课程, 其相关的数字标识为三五千七百七十九。:实现的移动端自动化测试框架到底是指什么样的含义?它是一个属于公开源代码的类型的, 能够同时在多个操作系统平台上进行移动应用自动化测试的工具和框架, 这个框架具备对iOS这一个平台, 以及… · 2026/11/5 7:55:52

【亲测可用】CraxsRat 7.4V3 仓库核查:名为“远程控制工具“,实为 RAT 木马破解版
【亲测可用】CraxsRat 7.4V3 仓库核查:名为“远程控制工具“,实为 RAT 木马破解版

【亲测可用】CraxsRat 7.4V3 仓库核查:名为"远程控制工具",实为 RAT 木马破解版 先说结论:这个仓库装的不是"功能强大的远程控制工具",而是一个名为 CraxsRat 的**远程访问木马(RAT)*… · 2026/11/5 7:55:52

武汉正高职称评审,业绩和送审材料看什么?4 个要点一次说清
武汉正高职称评审,业绩和送审材料看什么?4 个要点一次说清

​武汉正高职称评审,业绩和送审材料看什么?武汉正高职称评审,业绩看标志性成果,送审材料看证据链。正高业绩不是堆数量,而是看你能不能拿出主持大型项目、省部级课题、行业标准这类硬成果;送审材料讲究项目… · 2026/11/5 7:55:52

OpenMV与STM32F103C8T6串口通信实现物料搬运机器人视觉控制
OpenMV与STM32F103C8T6串口通信实现物料搬运机器人视觉控制

简介:这份资源面向参加工程训练类比赛的学生与嵌入式初学者,提供一套基于OpenMV视觉模块与STM32F103C8T6微控制器的物料搬运机器人完整代码方案,用C语言实现图像识别、目标定位与运动控制的协同,解决机器人自主识别物料并完成抓取… · 2026/11/5 8:28:09

GEE Assets 批量删除与复制实战指南
GEE Assets 批量删除与复制实战指南

资产目录越堆越乱这件事,几乎每个用 Google Earth Engine 做过几个项目的人都躲不过。最初的几个月图省事,导入的影像随手丢在根目录,命名全靠手打,Collection 和 Image 混在一起,等到项目交接或者要清理额度的时候&am… · 2026/11/5 8:28:09

BI工具冗余如何拖慢企业决策?破解数据孤岛难题
BI工具冗余如何拖慢企业决策?破解数据孤岛难题

1. 问题现象:BI工具越多,决策反而越慢的怪圈最近三年接触了47家企业的数据分析团队,发现一个有趣的反常现象:约68%的企业在引入第二个BI工具后,季度经营分析会的决策周期平均延长了2.3个工作日。某零售企业甚至出现了&… · 2026/11/5 8:28:09

数字孪生技术架构与实施全解析
数字孪生技术架构与实施全解析

1. 数字孪生技术全景解析:从概念到落地实践作为一名长期从事三维可视化与工业数字化的技术从业者,我见证了数字孪生技术从实验室概念到产业落地的完整发展历程。今天,我将系统性地梳理数字孪生领域300个核心术语与技术要点,这些知… · 2026/11/5 8:28:09

GIS可视化中色彩科学与ArcGIS色带应用
GIS可视化中色彩科学与ArcGIS色带应用

1. 色彩科学在GIS可视化中的核心价值地理信息系统(GIS)的可视化效果直接影响数据解读效率,而色彩作为最直观的视觉变量,其科学运用尤为关键。在ArcGIS平台中,色带(Color Ramp)不仅是简单的颜色过… · 2026/11/5 8:28:09

VDSR超分辨率实战:残差学习与20层卷积设计解析
VDSR超分辨率实战:残差学习与20层卷积设计解析

简介:这份资源围绕CVPR2016论文《Accurate Image Super-Resolution Using Very Deep Convolutional Networks》展开,提供VDSR超分辨率模型的Caffe实现,并附带MatConvNet测试代码,面向已具备深度学习基础、希望复现或改进单图像超分… · 2026/11/5 8:27:08

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码