使用go语言及Python语言实战把多核CPU跑满

简介: 一直有个疑问,Python及go能不能把多核CPU跑满,实践一把吧

机器配置

4核CPU


单线程代码

Python代码

whileTrue:
print("test")

go代码

packagemainimport"fmt"funcmain(){
for {
fmt.Println("test")
    }
}

都是死循环,如何把机器的CPU跑满


Python程序运行,top监控


go程序运行,top监控


看进程都把CPU跑满了100%,但我总共有4个CPU呢


接下来该怎么做?,上文代码中,都只有一个主线程执行,一个线程是无论如何也无法跑满多核CPU的


多线程代码

go版本,使用的是协程,GMP(超多个协程对应多个线程)

packagemainimport (
"fmt""time")
funcmain() {
fori :=0; i<200; i++ {
gofunc() {
for {
fmt.Println("test")
            }
        }()
    }
time.Sleep(100*time.Hour)
}

go程序再次运行,top监控


Python版本

importthreadingdefsay():
whileTrue:
print("test")
foriinrange(200):
threading.Thread(target=say).start()

python程序运行,top监控


好难啊,还没跑满CPU,可能是print打印这个不消耗CPU,那么搞点复杂的计算任务吧


多线程版本2

go版本

packagemainimport (
"fmt""time")
funcmain() {
fori :=0; i<200; i++ {
gofunc() {
for {
sum:=0fori :=1; i<=10000000; i++ {
sum+=i                }
fmt.Println(sum)
            }
        }()
    }
time.Sleep(100*time.Hour)
}

go程序运行,top监控

可以看到CPU已经达到376%,多核CPU资源已经基本上跑满了


Python版本

importthreadingdefsay():
whileTrue:
sum=0foriinrange(10000000):
sum+=iprint(sum)
foriinrange(200):
threading.Thread(target=say).start()

python程序运行,top监控

可以看到CPU使用率119%,并没有利用多核资源


Python多线程不能利用多核的资源,网上查找了下是因为GIL全局锁的原因,只能使用多进程

Python多进程

frommultiprocessingimportProcessdefsay():
whileTrue:
sum=0foriinrange(10000000):
sum+=iprint(sum)
foriinrange(4):
Process(target=say).start()


python程序运行,top监控

可以看到有4个Python进程,每个Python进程CPU都达到90%左右


结论: go可以充分利用多核资源,Python因为GIL锁的原因多线程并不能利用多核资源,需要用到多进程方式

目录
相关文章
|
6月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
794 7
|
6月前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
6月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
415 1
|
6月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
1100 1
|
6月前
|
存储 分布式计算 测试技术
Python学习之旅:从基础到实战第三章
总体来说,第三章是Python学习路程中的一个重要里程碑,它不仅加深了对基础概念的理解,还引入了更多高级特性,为后续的深入学习和实际应用打下坚实的基础。通过这一章的学习,读者应该能够更好地理解Python编程的核心概念,并准备好应对更复杂的编程挑战。
203 12
|
6月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
293 4
|
6月前
|
存储 数据采集 监控
Python文件操作全攻略:从基础到高级实战
本文系统讲解Python文件操作核心技巧,涵盖基础读写、指针控制、异常处理及大文件分块处理等实战场景。结合日志分析、CSV清洗等案例,助你高效掌握文本与二进制文件处理,提升程序健壮性与开发效率。(238字)
550 1
|
6月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
672 0
|
6月前
|
机器学习/深度学习 监控 数据挖掘
Python 高效清理 Excel 空白行列:从原理到实战
本文介绍如何使用Python的openpyxl库自动清理Excel中的空白行列。通过代码实现高效识别并删除无数据的行与列,解决文件臃肿、读取错误等问题,提升数据处理效率与准确性,适用于各类批量Excel清理任务。
620 0

推荐镜像

更多