使用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锁的原因多线程并不能利用多核资源,需要用到多进程方式

目录
相关文章
|
4天前
|
移动开发 JavaScript 前端开发
精通服务器推送事件(SSE)与 Python 和 Go 实现实时数据流 🚀
服务器推送事件(SSE)是HTML5规范的一部分,允许服务器通过HTTP向客户端实时推送更新。相比WebSocket,SSE更轻量、简单,适合单向通信场景,如实时股票更新或聊天消息。它基于HTTP协议,使用`EventSource` API实现客户端监听,支持自动重连和事件追踪。虽然存在单向通信与连接数限制,但其高效性使其成为许多轻量级实时应用的理想选择。文中提供了Python和Go语言的服务器实现示例,以及HTML/JavaScript的客户端代码,帮助开发者快速集成SSE功能,提升用户体验。
|
1月前
|
存储 算法 Go
Go语言实战:错误处理和panic_recover之自定义错误类型
本文深入探讨了Go语言中的错误处理和panic/recover机制,涵盖错误处理的基本概念、自定义错误类型的定义、panic和recover的工作原理及应用场景。通过具体代码示例介绍了如何定义自定义错误类型、检查和处理错误值,并使用panic和recover处理运行时错误。文章还讨论了错误处理在实际开发中的应用,如网络编程、文件操作和并发编程,并推荐了一些学习资源。最后展望了未来Go语言在错误处理方面的优化方向。
|
5月前
|
监控 并行计算 数据处理
构建高效Python应用:并发与异步编程的实战秘籍,IO与CPU密集型任务一网打尽!
在Python编程的征途中,面对日益增长的性能需求,如何构建高效的应用成为了每位开发者必须面对的课题。并发与异步编程作为提升程序性能的两大法宝,在处理IO密集型与CPU密集型任务时展现出了巨大的潜力。今天,我们将深入探讨这些技术的最佳实践,助你打造高效Python应用。
84 0
|
5月前
|
算法 Go Python
获取指定范围符合正态分布的随机数Go/Python
获取指定范围符合正态分布的随机数Go/Python
74 0
|
6月前
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
3月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
348 7
|
5月前
|
Go Docker Python
docker的python与go镜像的制作
docker的python与go镜像的制作
79 1
|
5月前
|
算法 安全 Go
RSA加密算法详解与Python和Go实现
RSA加密算法详解与Python和Go实现
371 1
|
6月前
|
安全 大数据 Go
深入探索Go语言并发编程:Goroutines与Channels的实战应用
在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
|
5月前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
85 0