关于提高并发量,python进程、线程和协程的区别

本文介绍了Python中的进程、线程和协程在处理并发时的区别。进程适合CPU密集型任务,能充分利用多核资源;线程在Python中受到GIL限制,更适合I/O密集型场景;协程虽单线程运行,但能减少上下文切换,适合高并发场景。多进程和协程可实现多核利用,而多线程在多核环境下可能导致线程颠簸,效率降低。

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

1. 进程
1)适合CPU密集型任务,eg:计算密集型场景,多并发,大量计算任务
2)数据分片:可以将数据分片处理的任务适合用多进程代码处理,核心思路是将data分片,对每一片数据处理返回结果(可能是无序的),然后合并。应用场景:多进程爬虫,类mapreduce任务。
3)只有Python多进程才能利用CPU多核资源,做到真正的多并发
3. 线程
1)对于python来说, 多线程是python的软肋
2)Python多线程适用于I/O密集型场景,如解决网络IO、磁盘IO阻塞问题,例如文件读写、网络数据传输等;,
3)Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。(因为同一个进程中的线程共享资源,所以要有互斥操作)
4)不要指望多线程能有效利用多核。如果一定要通过多线程利用多核,那只能通过C扩展来实现,不过这样就失去了Python简单易用的特点。Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。
5)多核多线程比单核多线程更差,原因是单核下多线程,每次释放GIL,唤醒的那个线程都能获取到GIL锁,所以能够无缝执行,但多核下,CPU0释放GIL后,其他CPU上的线程都会进行竞争,但GIL可能会马上又被CPU0拿到,导致其他几个CPU上被唤醒后的线程会醒着等待到切换时间后又进入待调度状态,这样会造成线程颠簸(thrashing),导致效率更低。
6)最典型的应用比如:tomcat,tomcat内部采用的就是多线程,上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用到我们的servlet程序,比如doGet或者doPost方法;做登录业务时使用到sms短信网关业务,创建子线程,让子线程去调用sms服务,主线程则返回,这样做可以提高用户的体验度;图片上传业务等

3. 协程
1)协程本质基于线程,同样不能充分发挥多核的优势
2)一个进程可以包含多个线程,一个线程也可以包含多个协程,必须明确,一个线程内的多个协程的运行是串行的。
3)协程也处理IO密集型的并发
4)无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。
5)无需线程上下文切换的开销、无需原子操作锁定及同步的开销、方便切换控制流,简化编程模型,高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值