python 并发场景梳理

news/2025/2/21 15:55:24/文章来源:https://www.cnblogs.com/dgp-zjz/p/18729367

一、多进程(Multiprocessing)

1、使用场景

适合CPU密集型任务,因为每个进程运行在独立的Python解释器中,不受全局解释器锁(GIL)的影响。

2、代码

from multiprocessing import Process
import timedef task():print("Task is running")time.sleep(10)processes = []
for _ in range(50):p = Process(target=task)processes.append(p)p.start()for p in processes:p.join()

同时启动50个进程,50个进程执行同样的任务,他们没有GIL锁,时间几乎是并发的,执行结束10s左右

# time 统计的时间
real	0m10.135s
user	0m0.094s
sys	0m0.179s# 查看进程
ps -ef | grep -w 'process_example.py' | wc -l 
52
root     3925498 3925455  0 15:52 pts/0    00:00:00 python3 process_example.py
root     3925499 3925455  0 15:52 pts/0    00:00:00 python3 process_example.py
root     3925500 3925455  0 15:52 pts/0    00:00:00 python3 process_example.py
root     3925501 3925455  0 15:52 pts/0    00:00:00 python3 process_example.py
root     3925502 3925455  0 15:52 pts/0    00:00:00 python3 process_example.py
root     3925503 3925455  0 15:52 pts/0    00:00:00 python3 process_example.py
root     3925504 3925455  0 15:52 pts/0    00:00:00 python3 process_example.py
root     3925505 3925455  0 15:52 pts/0    00:00:00 python3 process_example.py
root     3925565 3885440  0 15:52 pts/1    00:00:00 grep --color=auto process_example.py  

二、多线程(Threading)

1、使用场景

适用于I/O密集型任务,如文件读取、网络请求等。线程共享内存,因此适合需要频繁数据交换的任务。

相比之下,对于CPU密集型任务,由于几乎所有的时间都用于执行Python代码,GIL几乎始终被一个线程所占用,导致其他线程无法并行执行。

然而,在I/O密集型任务中,频繁的I/O操作和GIL的适时释放使线程能够更好地并行工作,从而减轻GIL对性能的负面影响。

因此,在I/O密集型应用场景中,多线程的使用通常能够有效地提高性能,因为阻塞I/O操作的等待时间可以被用来执行其他进程或线程的工作。

2、案例

import threading
import timedef cpu_intensive_task(n):print(f"CPU Thread {n} starting...")count = 0for _ in range(50):  # 重复执行多次耗时任务# 一个更重的计算任务for i in range(10**7):count += itime.sleep(1)  # 增加一些休眠时间print(f"CPU Thread {n} finished with count = {count}")def io_intensive_task(n):print(f"I/O Thread {n} starting...")for _ in range(50):# 模拟一个I/O耗时任务,例如文件读写time.sleep(2)  # 模拟I/O等待时间print(f"I/O Thread {n} finished.")threads = []
num_cpu_threads = 4
num_io_threads = 4# 创建CPU密集型任务的线程
#for i in range(num_cpu_threads):
#    t = threading.Thread(target=cpu_intensive_task, args=(i,))
#    threads.append(t)
#    t.start()# 创建I/O密集型任务的线程
for i in range(num_io_threads):t = threading.Thread(target=io_intensive_task, args=(i,))threads.append(t)t.start()for t in threads:t.join()print("All threads have completed.")

三、

四、

五、性能分析工具

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887632.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pic2Word

目录概Pic2Word代码Saito K., Sohn K., Zhang X., Li C., Lee C., Saenko K., and Pfister T. Pic2Word: Mapping pictures to words for zero-shot composed image retrieval. CVPR, 2023.概 本文关注的是 Composed Image Retrieval (CIR) 任务: 给定一个 reference (query) i…

SciTech-EECS-BigDataAIML-NN(神经网络): 常用的18种Activation(激活函数)

SciTech-EECS-BigDataAIML-NN(神经网络): 常用的18种Activation(激活函数) 一:简介 二:为什么要用激活函数 三:激活函数的分类 四:常见的几种激活函数 4.1.Sigmoid函数 4.2.Tanh函数 4.3.ReLU函数 4.4.Leaky Relu函数 4.5.PRelu函数 4.6.ELU函数 4.7.SELU函数 4.8.Swish函数…

用了CRM后,业绩不升反滑?问题可能出在这6个地方!

用了CRM系统后,我的公司——客户跟丢了 销售效率下降了 业绩一落千丈哈哈,比我惨的还有谁?! 不过我潜心研究了一阵,终于把这个CRM系统给弄懂了! 今天就跟大家聊一聊,为什么用了CRM系统后不仅没能提升业绩,反而拖了后腿,这是踩了哪些坑?以及该怎么调整才能真正发挥CRM…

功率MOS管的参数说明

图解功率MOS管的每一个参数!最大额定参数 最大额定参数,所有数值取得条件(Ta=25℃)VDSS 最大漏-源电压 在栅源短接,漏-源额定电压(VDSS)是指漏-源未发生雪崩击穿前所能施加的最大电压。根据温度的不同,实际雪崩击穿电压可能低于额定VDSS。关于V(BR)DSS的详细描述请参见静电…

安卓系统远程控制电脑方法,手机远控教程,ToDesk工具

不知道大家有没有觉得手机、平板虽然很好用,却也仍存在有很多替代不了电脑的地方。 就比如说撰写文档、做数据报表啥的就不如PC端操作般方便,就跟别说PS修图、AE视频剪辑等需高性能设备来带动才易用的了。 好在也是有对策可解决,装个ToDesk远程控制工具便能实现各设备的互联…

功率器件热设计基础(八)——利用瞬态热阻计算二极管浪涌电流

上一篇讲了两种热等效电路模型,Cauer模型和Foster模型,这一篇以二极管的浪涌电流为例,讲清瞬态热阻曲线的应用。/ 前言 / 功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础,只有掌握功率半导体的热设计基础知识,才能完成精确热设计,提高功率器件的利用率,降低系统…

利用 Sapnco 在.net/c# 中跨系统调用 SAP RFC 功能,执行SAP中的函数

利用Sapnco 在.net/c# 中跨系统调用 SAP RFC 功能,执行SAP中的函数 Sapnco -C#中使用的核心组件,sap官网有下,本文使用的版本在 framework 平台使用, sap 官网地址,但是下载要权限,全名称为: SAP Connector for Microsoft .NET ,链接:https://support.sap.com/en/pro…

SAP咨询公司排名探析:谁执牛耳?

SAP作为全球领先的软件集成供应商,其提供的ERP、CRM、SCM及BI等解决方案深受企业青睐。而SAP咨询公司,作为SAP软件实施、咨询与运维服务。如何评判这些咨询公司的实力呢?以下,我们将从分类、评估指标及领先公司等方面进行深入探讨。一、SAP咨询公司的双轨并行SAP咨询公司大…

Jmeter 自定义的respCode不是0就报异常

在实际使用中,后台其实已经对异常的进行了处理,response body 返回来的,都是正常的请求响应; 这个时候,则需要通过 respCode 进行判断该请求是否是有效响应。 如响应报文如下:{"respCode": 0,"errMsg": null,"data": 100000 } 处理:对 …

mysql 索引页存储关系

前言 简单介绍一下页存储的关系。 正文 在前文中,我们已经知道了页存储的内怎么去查询的数据的,也就两点。记录根据主键(索引)按照顺序链式存储有一个page directory,里面有槽,可以快速定位到槽,然后就可以从链式存储的某个点进行分组查询理论上这样在一页内查询还是非常o…

为什么你的客户留不住?可能是CRM没用对!

最近同事跟我抱怨: ——“营销活动越做越多,可是活跃的客户突然就不见了。” ——”跟客户明明聊的好好的,怎么一转头就不合作了?“ ——“客户一走,业绩没保障,我可太焦虑了😭!!!” 客户流失率越来越高,不仅影响个人业绩,从长远来看,还会影响到公司品牌的信誉和…

如何在JMeter中配置断言,将非200状态码视为测试成功

如何在JMeter中配置断言,将非200状态码视为测试成功 引言 在接口测试中,HTTP响应状态码是判断请求是否成功的重要依据。通常情况下,状态码200表示请求成功,而其他状态码则可能表示各种类型的错误。然而,在某些特定场景下,我们可能期望接收到非200的状态码,并将其视为测试…