Python一直被诟病并发很弱,确实,因为GIL的关系,Python在单进程运行的情况下,无法利用多核CPU,所以就被其他能在单进程的情况下利用多核CPU的语言“吊打”性能了。
但在使用了多进程后,结果仍然如此吗?为此,我特意做了一组实验。
我用VirtualBox新建了一台ubuntu虚拟机,配置为10G内存,4核CPU
使用apache2的ab进行测试,并发数为1000,请求10万次。
Python程序代码如下:
from sanic import Sanic
from sanic.response import json,text
app = Sanic()
@app.route("/")
async def test(request):
return text("hello")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000,access_log=False,workers=4)
测试结果,平均每秒处理15000个请求
Golang程序如下:
package main
import (
"fmt"
"log"
"net/http"
)
func index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "test message")
}
func main() {
http.HandleFunc("/", index)
err := http.ListenAndServe(":9090", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
测试结果,平均每秒处理18000个请求
虽然Golang没有开多进程,但是Golang是能单进程跑满CPU的,所以开不开多进程并没有多大必要。
从上面的结果可以看出,Golang平均每秒处理18000个请求,Python平均每秒处理15000个请求,Golang的标准库比Python的Sanic快大约20%
由此可以看出Python在Web端的运行效率其实并没有想象的那么差劲。这次的实验让我不禁揣测,黒Python性能差,一秒只能处理几十个请求的朋友,是否只是刚刚入门Python而以。而同样鼓吹Golang性能牛,从而踩Python和其他语言的朋友,是否也都是在入门级别。因为Web后台的处理速度,和语言的关系并不大,瓶颈会在数据库和架构,而不是语言本身。
真心希望大家能公平的对待每一种语言,而不是随意抹黑。