当前位置: 首页 > 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.jsqmd.com/news/963467/

相关文章:

  • 2026 年 AI 图片编辑工具排名|不会 PS 怎么做图,ImageGood 强势上榜 - GrowthUME
  • QtScrcpy终极指南:如何在电脑上完美控制Android设备
  • 如何构建全网音乐聚合平台:洛雪音乐音源终极指南
  • Oracle企业管理器介绍
  • 嵌入式开发核心串行通信协议:SPI、I2C、UART/USART深度解析与实战选型
  • HC-05/06蓝牙模块与手机通信全攻略:从AT指令配置到双向数据传输
  • AI辅助开发:让快马生成具备智能诊断与预测功能的电池分析应用
  • 夸克网盘批量管理终极指南:如何高效转存分享与下载文件
  • TrollInstallerX终极指南:iPhone 6s在iOS 15.8.3上的完美安装方案
  • OIDC Discovery 与令牌验证:从 .well-known openid-configuration 到信任链构建
  • 终极指南:如何用Python快速识别54种编程语言
  • 沈阳市中级经济师工商管理/人力资源管理:适配人群、岗位匹配与备考全攻略 - 众智商学院课程中心
  • OpenCV直方图比较:四种方法原理、实战与工业应用
  • 2026年一键抠图APP推荐完整指南,安卓苹果免费好用工具排行
  • 海口黄金回收,禹竞名奢汇:大盘计价|全城上门|现款现结 - 奢侈品交易观察员
  • 完整基于 Java 的商业系统包含哪些组件?深度分析
  • 两段式恒流充电方案:分立元件实现锂电池精准充电终止检测
  • PrivateGPT:3步搭建你的私有AI助手,数据100%不外泄
  • 2026年南京市PMP培训机构哪家好?官方授权R.E.P.报考指南 - 众智商学院课程中心
  • 国内合规 AI 写作平台盘点:精准降低 AIGC 查重率,学术写作安全避坑
  • Windows 11 LTSC微软商店一键安装完整指南:3步解锁完整应用生态
  • 生成式引擎优化(GEO)技术深度解析:从 EEAT 采信机制到 Agentic GEO 的范式演进
  • 别再找串口调试助手了!用LabVIEW VISA自己搓一个,还能自定义UI(附源码)
  • 无人机行人精准检测数据集分享(适用于YOLO系列深度学习分类检测任务)
  • 别再搞错了!用MATLAB仿真告诉你,NOMA里SIC顺序为什么必须是强用户先解码
  • 别再只盯着MQTT了!聊聊自动驾驶和机器人里更硬核的通信中间件DDS
  • 2026年装配式A1级不燃冰火板可靠供应厂家深度分析 - 品牌企业推荐师(官方)
  • AI重塑秋冬服饰设计,让服装生意更高效盈利
  • 无需本地折腾,用快马平台5分钟搭建claude code云端原型验证工具
  • 新手也能看懂的IDA反汇编实战:从APK里揪出SO库,一步步破解EasySo的CheckString函数