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

Python3 基础:多线程与多进程

多线程与多进程基础

Python 中的并发编程主要通过threading模块实现多线程,以及通过multiprocessing模块实现多进程。两者的核心区别在于:线程共享进程内存空间,适合 I/O 密集型任务;进程拥有独立内存空间,适合 CPU 密集型任务,且能绕过 GIL(全局解释器锁)的限制。

importthreadingimportmultiprocessing# 创建一个线程t=threading.Thread(target=lambda:print("Hello from thread"))# 创建一个进程p=multiprocessing.Process(target=lambda:print("Hello from process"))

线程的创建与启动

使用threading模块可以方便地创建和管理线程:

importthreadingimporttimedefworker(name):print(f"Thread{name}starting")time.sleep(1)print(f"Thread{name}finished")# 创建线程t1=threading.Thread(target=worker,args=("A",))t2=threading.Thread(target=worker,args=("B",))# 启动线程t1.start()t2.start()# 等待线程完成t1.join()t2.join()print("All threads completed")

常用线程同步机制

threading模块提供了丰富的线程同步工具:

importthreadingimporttime# 共享资源counter=0lock=threading.Lock()defincrement():globalcounterfor_inrange(1000):# 获取锁,防止竞态条件withlock:temp=counter time.sleep(0.0001)# 模拟操作延迟counter=temp+1# 创建多个线程threads=[]foriinrange(5):t=threading.Thread(target=increment)threads.append(t)t.start()# 等待所有线程完成fortinthreads:t.join()print(f"Final counter value:{counter}")

线程池与并发执行

使用concurrent.futures模块可以更高效地管理线程池:

importconcurrent.futuresimporttimedeffetch_data(url):time.sleep(1)# 模拟网络请求returnf"Data from{url}"urls=["https://api.example.com/1","https://api.example.com/2","https://api.example.com/3"]# 使用线程池并发执行 I/O 密集型任务withconcurrent.futures.ThreadPoolExecutor(max_workers=3)asexecutor:results=executor.map(fetch_data,urls)forresultinresults:print(result)

多进程的创建与管理

multiprocessing模块提供了与threading类似的 API,但运行在独立的进程中:

importmultiprocessingimportosdefcpu_intensive_task(n):pid=os.getpid()print(f"Process{pid}processing{n}")# 模拟 CPU 密集型计算total=0foriinrange(n):total+=i**2returntotalif__name__=="__main__":# 创建进程池withmultiprocessing.Pool(processes=4)aspool:numbers=[1000000,2000000,3000000,4000000]results=pool.map(cpu_intensive_task,numbers)print(f"Results:{results}")

进程间通信

进程拥有独立内存空间,需要使用特定机制进行数据交换:

importmultiprocessingdefproducer(queue):foritemin["apple","orange","banana"]:queue.put(item)print(f"Produced:{item}")queue.put(None)# 发送结束信号defconsumer(queue):whileTrue:item=queue.get()ifitemisNone:breakprint(f"Consumed:{item}")if__name__=="__main__":# 创建队列用于进程间通信q=multiprocessing.Queue()p1=multiprocessing.Process(target=producer,args=(q,))p2=multiprocessing.Process(target=consumer,args=(q,))p1.start()p2.start()p1.join()p2.join()

安全的数据共享

为防止数据竞争,推荐使用进程安全的同步原语:

importmultiprocessingdefincrement(shared_counter,lock):for_inrange(1000):# 获取锁,确保原子操作withlock:shared_counter.value+=1if__name__=="__main__":# 共享变量和锁counter=multiprocessing.Value('i',0)lock=multiprocessing.Lock()processes=[]for_inrange(5):p=multiprocessing.Process(target=increment,args=(counter,lock))processes.append(p)p.start()forpinprocesses:p.join()print(f"Final counter value:{counter.value}")

自定义线程/进程类

通过继承基类可以实现更灵活的并发控制:

importthreadingclassCustomThread(threading.Thread):def__init__(self,name):super().__init__()self.name=namedefrun(self):print(f"Custom thread{self.name}is running")# 执行自定义任务result=sum(range(1000))print(f"Custom thread{self.name}finished with result:{result}")# 创建并启动自定义线程t=CustomThread("Worker-1")t.start()t.join()

性能注意事项

并发编程在 Python 中需要特别注意性能和资源问题:

  • I/O 密集型任务(网络请求、文件读写):优先使用多线程或asyncio
  • CPU 密集型任务(计算、数据处理):优先使用多进程绕过 GIL
  • 避免创建过多线程/进程,通常数量与 CPU 核心数相当或略多
  • 注意线程安全和进程间通信的开销
  • 考虑使用concurrent.futures简化并发代码的管理

以上代码示例涵盖了 Python3 多线程与多进程的主要概念和操作,从基础用法到高级技巧,为开发者提供了全面的参考。

http://www.gsyq.cn/news/1475140.html

相关文章:

  • QtScrcpy终极指南:如何在电脑上完美控制Android设备
  • Oracle企业管理器介绍
  • HC-05/06蓝牙模块与手机通信全攻略:从AT指令配置到双向数据传输
  • 沈阳市中级经济师工商管理/人力资源管理:适配人群、岗位匹配与备考全攻略 - 众智商学院课程中心
  • 终极指南:如何用Python快速识别54种编程语言
  • 2026年一键抠图APP推荐完整指南,安卓苹果免费好用工具排行
  • 两段式恒流充电方案:分立元件实现锂电池精准充电终止检测
  • 国内合规 AI 写作平台盘点:精准降低 AIGC 查重率,学术写作安全避坑
  • PrivateGPT:3步搭建你的私有AI助手,数据100%不外泄
  • 无人机行人精准检测数据集分享(适用于YOLO系列深度学习分类检测任务)
  • 别再只盯着MQTT了!聊聊自动驾驶和机器人里更硬核的通信中间件DDS
  • 2026年6月重庆大学城租房机构最新实测 适配各类租客居住需求 - 奔跑123
  • 深度学习最全入门详解:核心原理、模型分类与应用场景(新手必看)
  • 从VGG16到ResNet18:为什么你的CNN模型不是越深越好?聊聊梯度消失与‘捷径’的诞生
  • 如何构建高性能WebGL应用:gl-matrix数学库的技术架构解析
  • 2026年杭州AI搜索优化服务商全景评测:从技术到实战的深度选型指南 - 品牌报告
  • CRT彩电产业供应链重构:从洋垃圾到亿万财富的商业逻辑
  • 图吧工具箱与自动化运维
  • 从‘说话’到‘摔倒’:手把手教你用SlowFast训练任意自定义动作(附完整配置文件解析)
  • 如何通过Fast-GitHub插件实现GitHub访问速度10倍提升的突破性解决方案
  • 2026年EPE珍珠棉供应厂家:异形/白色/高密度/精密/水果/汽车零部件EPE专业源头工厂精选 - 品牌企业推荐师(官方)
  • 2026 广东十大除甲醛品牌权威推荐——粤港澳大湾区室内空气治理行业深度测评 - 环保除醛知识库
  • 别再死记DenseNet结构图了!用PyTorch手写一个Dense Block,彻底搞懂它的‘密集’在哪
  • 从零到一:用DDS在C++/Python里实现一个简单的发布订阅聊天室(附完整代码)
  • 2026昆明黄金回收行业龙头标杆!合扬稳居翘楚领跑本地回收榜单 - 开心测评
  • 模板驱动型文档自动化:结构化内容生产新范式
  • 紧急预警!CSDN 6月算法升级后,91.3%的“伪原创”AI营销文触发二次人工审核——你的内容还在裸奔吗?
  • 如何用Coraza WAF在5分钟内为Go应用构建企业级Web安全防护
  • 别被坑了!2026实测靠谱的AI论文平台|实测必入避坑版
  • 从《模拟城市》到SUMO:用flow标签模拟早晚高峰车流(附完整配置文件)