python 9.2 multiprocessing

本文详细解析了Python多线程的局限性,特别是全局解释器锁(GIL)带来的影响,以及在不同场景下如何有效利用多线程和多进程。同时,对比介绍了Python多线程和多进程模块(threading和multiprocessing)的基本用法,特别关注了多线程在IO密集型任务中的优势和多进程在CPU密集型任务的应用,通过实例阐述了如何构建线程池和进程池,以及Python并行任务技巧,旨在帮助开发者在实际项目中做出更合理的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前用python的threading来进行多线程编程,对性能确实有提高。但似乎有点复杂,因为要维护一个工作队列,并且要注意死锁问题。python的threading和multiprocessing模块初探介绍了用threading创建多线程和multiprocessing创建多进程的基本方法。

python多线程的限制
python多线程有个讨厌的限制,全局解释器锁(global interpreter lock),也就是GIL。这个锁的意思是任一时间只能有一个线程使用解释器,跟单cpu跑多个程序一个意思,大家都是轮着用的,这叫“并发”,不是“并行”。手册上的解释是为了保证对象模型的正确性!这个锁造成的困扰是如果有一个计算密集型的线程占着cpu,其他的线程都得等着….,试想你的多个线程中有这么一个线程,得多悲剧,多线程生生被搞成串行;当然这个模块也不是毫无用处,手册上又说了:当用于IO密集型任务时,IO期间线程会释放解释器,这样别的线程就有机会使用解释器了!所以是否使用这个模块需要考虑面对的任务类型。

所以从上面的一段话就能知道为什么对python来说cpu密集型程序不适合多线程。

为什么有人说 Python 的多线程是鸡肋呢?
如果你的代码是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有context switch

但是:如果你的代码是IO密集型,多线程可以明显提高效率。例如制作爬虫(我就不明白为什么Python总和爬虫联系在一起…不过也只想起来这个例子…),绝大多数时间爬虫是在等待socket返回数据。这个时候C代码里是有release GIL的,最终结果是某个线程等待IO的时候其他线程可以继续执行。

multiprocessing模块

python的multiprocessing模块是处理python多进程的模块,但multiprocessing模块中有个dummy的子模块。multiprocessing.dummy对多线程编程进行了包装。建立线程池变得简单,不用程序员自己来维护队列,

from multiprocessing import Pool as ThreadPool
pool = ThreadPool(pool_size)
# pool_size is an integer which indicates the size of thread pool

这样简单一句话就建立了一个线程池。并且multiprocessing和multiprocessing.dummy都支持map并发(我不知道map并发什么意思,我理解成支持map操作)。Python 并行任务技巧讲的用multiprocessing.dummy来进行多线程编程,文章举例时用python爬虫,这里python爬虫不是cpu密集型的程序。在文章后面还介绍了cpu密集型程序并发时是用的multiprocessing模块,建立的是进程池,两个模块方法名很像,容易混淆。

multiprocessing是建立进程池,多进程;multiprocessing.dummy是建立线程池,多线程。

references & note:
* Python 并行任务技巧
* 进程、线程和协程的理解
* 使用Python进行并发编程
* python的threading和multiprocessing模块初探
* 为什么有人说 Python 的多线程是鸡肋呢?
* 用python爬虫抓站的一些技巧总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值