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

进程与线程:并发编程基础

摘要进程与线程是操作系统面试的必考点也是理解 AI 分布式训练和多线程数据加载的基础。本文从进程内存模型出发系统讲解线程同步机制锁、信号量、条件变量并通过 Python 代码展示多线程爬虫和生产者-消费者模型的实现。一、进程 vs 线程核心区别1.1 内存模型对比进程 B独立的地址空间进程 A代码段数据段堆栈 1栈 2共享内存图 1进程内存模型特性进程线程地址空间独立共享除栈外切换开销大需切换页表小通信方式IPC管道、共享内存、Socket直接读写共享变量崩溃影响不影响其他进程可能导致整个进程崩溃创建开销大小1.2 Python 的 GILPython 的GIL全局解释器锁意味着同一时刻只有一个线程执行 Python 字节码。但这不意味着多线程无用IO 密集型任务网络请求、文件读写多线程仍有收益CPU 密集型任务应使用多进程multiprocessing绕过 GIL。二、线程同步机制2.1 锁、信号量、条件变量 线程同步机制演示 包含锁、信号量、条件变量 importthreadingimporttimefromqueueimportQueuefromtypingimportListclassThreadSyncDemo:线程同步演示staticmethoddefdemo_lock(): 互斥锁演示 保护共享计数器的线程安全 counter0lockthreading.Lock()defincrement():nonlocalcounterfor_inrange(100000):withlock:# 获取锁counter1threads[threading.Thread(targetincrement)for_inrange(5)]fortinthreads:t.start()fortinthreads:t.join()print(f带锁计数器结果:{counter}(期望 500000))staticmethoddefdemo_semaphore(): 信号量演示 限制同时访问资源的线程数量 semaphorethreading.Semaphore(3)# 最多 3 个线程同时执行defworker(worker_id:int):withsemaphore:print(fWorker{worker_id}开始执行)time.sleep(1)print(fWorker{worker_id}执行完毕)threads[threading.Thread(targetworker,args(i,))foriinrange(6)]fortinthreads:t.start()fortinthreads:t.join()staticmethoddefproducer_consumer(): 生产者-消费者模型 使用条件变量实现线程间协调 queueQueue(maxsize10)defproducer():foriinrange(20):itemfitem_{i}queue.put(item)print(f生产:{item})time.sleep(0.1)defconsumer():for_inrange(20):itemqueue.get()print(f消费:{item})queue.task_done()time.sleep(0.2)pthreading.Thread(targetproducer)cthreading.Thread(targetconsumer)p.start()c.start()p.join()c.join()deftest_thread_sync():print(*60)print(线程同步测试)print(*60)demoThreadSyncDemo()print(\n【测试 1】互斥锁)demo.demo_lock()print(\n【测试 2】信号量)demo.demo_semaphore()print(\n【测试 3】生产者-消费者)demo.producer_consumer()print(\n*60)if__name____main__:test_thread_sync()代码 1线程同步机制三、AI 场景多进程数据加载 PyTorch DataLoader 风格的多进程数据加载 frommultiprocessingimportPool,QueueasMPQueueimporttimedefpreprocess_data(item_id:int)-dict:模拟数据预处理time.sleep(0.1)# 模拟耗时操作return{id:item_id,features:[item_id*iforiinrange(10)]}defparallel_data_loading(num_items:int100,num_workers:int4): 并行数据加载 使用多进程绕过 GIL加速 CPU 密集型预处理 starttime.time()withPool(num_workers)aspool:resultspool.map(preprocess_data,range(num_items))elapsedtime.time()-startprint(f加载{num_items}条数据{num_workers}个 Worker)print(f耗时:{elapsed:.2f}秒)print(f吞吐量:{num_items/elapsed:.1f}items/s)returnresultsdeftest_data_loading():print(\n并行数据加载测试:)parallel_data_loading(100,4)if__name____main__:test_data_loading()代码 2多进程数据加载四、面试高频问题Q1进程间通信有哪些方式答管道、消息队列、共享内存、信号量、Socket、信号。Q2死锁的四个必要条件答互斥、占有且等待、不可抢占、循环等待。破坏任一条件即可避免死锁。Q3Python 的多线程为什么不适合 CPU 密集型任务答GIL 限制同一时刻只有一个线程执行 Python 字节码多线程无法并行利用多核。五、总结核心要点进程是资源分配单位线程是调度单位线程同步是并发编程的核心难点锁粒度要细持有时间要短Python 中 IO 密集用线程CPU 密集用进程死锁预防优于检测设计时避免循环等待。本文基于 Coding Interview University 项目整理专注进程与线程专题。
http://www.gsyq.cn/news/1361602.html

相关文章:

  • 大数据+大模型=乘法效应?6个场景告诉你,大模型如何让你的数据平台“活”起来!
  • 计算机网络基础:TCP/IP 与 HTTP 核心知识
  • 缓存设计:从 LRU 到 Redis 实战
  • AI Agent自主操作软件实战手册(从PoC到生产环境全链路拆解)
  • 收藏!小白程序员必看:用8192维度理解大模型如何生成文字的循环奥秘
  • RAG已死?大模型主动“翻文件”实现精准检索,告别幻觉与低效!附GitHub源码!
  • 【2026最新全网最细】MySQL卸载、下载、安装、配置、使用全流程图文解析、和细节讲解(保姆级教学)
  • MySQL 进阶教程 第一章第二章
  • Go语言命名规范:清晰的命名
  • Go语言接口设计:最小接口原则
  • HTML 零基础入门:从概念到常用标签详解,前端入门超详细版
  • Manim完整指南:如何快速掌握数学动画引擎的终极教程
  • 工厂短视频培训哪个课程靠谱 - 资讯纵览
  • Air1601 LCD屏开发:规格+RGB接口+排线定义 干货汇总
  • BepInEx:如何为Unity和.NET游戏构建可扩展的模组生态系统
  • 文生图测试:没有一个大模型能表达出的幽默感
  • 【紧急预警】Apple Podcasts与Spotify已启动AI语音内容水印识别系统——3步完成合规声纹嵌入(含Python脚本+FFmpeg参数集)
  • 【Web安全】-企业资产信息收集(1):信息收集介绍,域名信息收集,主域名查询,ICP备案号查询,备案实体查询,工业和信息化部政务服务平台查询,怎样收集
  • 从翻车到封神:1个被低估的--no参数+2个隐藏材质关键词,让水面倒影清晰度突破人眼分辨极限
  • AI Agent在金融运维中如何实现99.99%故障自愈?——基于3家头部银行落地数据的深度复盘
  • 从东方修心到 AI 工程:我用 Spring AI 重构了一套七境智能体操作系统
  • AI 算力基础设施、国产 GPU 与算力自主可控之路
  • 大模型核心模块深度解析:算力消耗与适用场景全解析!
  • C166 Class B硬件陷阱解析与调试实战
  • 清远搬厂公司推荐:实惠靠谱、无缝搬家全攻略2026 - 从来都是英雄出少年
  • 【游戏设计】游戏循环的奥秘
  • 网络可观测性:洞察和监控网络流量
  • CNKI-download:3步实现知网文献批量下载与管理的Python自动化工具
  • 宣威龙泉汽修,宣威修车哪家好 - 资讯纵览
  • JDK常用类与工具(速览版)