互联网后台开发语言JAVA、PHP、Golang、Python优劣比较

一.使用率比较

根据 Tiobe发布的最新一期(2019年3月份)编程语言欢迎度榜单,JAVA以14.88%的使用率排名第一,Python以8.262%排名第三,PHP以2.42%排名第八,GO以1.016%排名18位,具体见下图

互联网后台开发语言JAVA、PHP、Golang、Python优劣比较插图1所有语言3月排行榜

JAVA作为后台语言界的老大,一直占据有利地位,世界前十大网站Google、YouTube、FaceBook、YaHoo、Amazon、Twitter、eBAY等一直都用它作为公司主力后台开发语言,可以说能力担当。

Python的易读性、低门槛、高效率、丰富开源扩展库一直是互联网巨头青睐的对象,Google几乎从一开始就一直是Python的支持者。最开始,Google的创始人决定除了一些必须使用C ++的关键部分之外,可以随意使用Python.。这意味着C ++被用于需要内存控制和低延迟的地方。Python用与易于维护的部分和快速交付的工程。Python现在是官方的Google服务器端语言之一,除此之外还有C ++,Java和Go三种语言用于生产环境中。

互联网后台开发语言JAVA、PHP、Golang、Python优劣比较插图3python优势

Facebook的产品工程师非常热衷于Python,把它作为这家社交媒体巨头的第三大流行语言(仅次于C ++和他们专有的PHP语言Hack)。Facebook上有超过5,000项功能都是用Python完成的,它们包括管理基础架构,二进制分发,硬件映像以及一些自动操作。使用Python库的简易性意味着产品工程师不必编写和维护更多的代码,从而使他们能够专注于实时改进。Python还确保Facebook的基础架构能够实现高效扩展。

Spotify这家音乐流媒体巨头是Python的巨大支持者,主要使用该语言进行数据分析和后端服务。在后端,有大量的服务都通过0MQ(ZeroMQ)进行通信,这是一种用Python和C ++(以及其他语言)编写的开源网络库和框架。

PHP虽然排名第八,但是毫无疑问占据着web应用领域的霸主地位。作为一个脚本语言,PHP的快速,开发成本低,周期短,后期维护费用低,开源产品丰富,PHP已经是国内外大部分Web项目的首选语言。目前全球5000万互联网网站中,有60%以上使用着PHP技术:PHP也入选是全球五大最受欢迎的编程语言,并且是唯一入选的脚本语言;国内80%以上的动态网站都在使用PHP开发,各个网站都有PHP的影子。

Golang作为后起之秀,从16年Tiobe排名从0.161%一度跃最高升至2.001%,意味着Golang从一个利基工具正式走入了真正的程序设计语言的行列。Go语言之所以能够飞速发展,很大一部分原因是Google的支持。Google是一家重视未来的公司,我们可以从一些蛛丝马迹中发现与谷歌阅读器相比,Google似乎更致力于Go语言,目前Google在无人驾驶汽车和其它新奇特的东西投入了大量的精力,这也为Go语言的发展提供了助力。

互联网后台开发语言JAVA、PHP、Golang、Python优劣比较插图5go后起之秀

二.全景优劣比较

学习成本从低到高PHP性能从高到低Go>Java>PHP7.0>Python开源类库支持Python>PHP7.0>Java>Go多线程支持比较Go的goroutine协程概念(也叫超线程,就是线程上的线程)采用的切换算法就是work-steel算法,他能让你采用很简单的编程模型编写能处理高并发的程序,这就是goroutine的好处。Java线程和操作系统是一对一的关系,也就是说当你创建一个Java线程的时候,实际上系统同时创建了一个系统线程来跑该Java线程,同理Java的所以的线程操作都是和系统线程有对应的实现。通常一个系统通常会有成千上万个任务要同时执行,理论上要创建成千上万个线程分别来执行每个任务,但通常你的电脑只有几个cpu,如果这样,就会有上万个线程来分享这几个cpu。这就涉及到切换线程来占用cpu,每次切换动作,需要保存上一个线程的context(上下文)然后把下一个线程的上下文提出来给cpu。这样会有啥问题呢?上面说到Java的线程是系统原生的线程,所以Java线程的切换都是系统级别的线程切换,这样每次切换除了要保存和提取,重要的是进程要从用户态切换系统态下来完成。总之就是每次线程切换都很耗费资源。如果真的有很多线程同时跑在系统上,很多资源都耗费在现场切换上了,Java通常上了2k个线程就受不了啦。所以,Java这种线程和系统线程一一对应的关系就有些问题,于是就有了threadpool,一个线程池少数几个线程对应多个任务,但是这样任务的状态啥的要你自己维护了,所有写这样的代码就需要功力啦。Python中的线程是操作系统的原生线程,虚拟机内部使用一个全局解释器锁(GIL)来互斥线程对虚拟机的使用.为了支持多线程,一个基本的要求就是需要实现不同线程对共享资源访问的互斥,这正是引入的根本原因GIL.每个CPU在同一时间只能执行一个线程(在单核CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。)在Python多线程下,每个线程的执行方式:1.获取GIL 2.执行代码直到sleep或者是python虚拟机将其挂起.3.释放GIL.而每次释放GIL锁,线程进行锁竞争、切换线程,会消耗资源。并且由于GIL锁存在,python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),这就是为什么在多核CPU上,python的多线程效率并不高.Python下的多核性能:多核多线程比单核多线程更差,原因是单核下多线程,每次释放GIL,唤醒的那个线程都能获取到GIL锁,所以能够无缝执行,但多核下,CPU0释放GIL后,其他CPU上的线程都会进行竞争,但GIL可能会马上又被CPU0拿到,导致其他几个CPU上被唤醒后的线程会醒着等待到切换时间后又进入待调度状态,这样会造成线程颠簸(thrashing),导致效率更低。Python下的多进程性能:每个进程有各自独立的GIL,互不干扰,这样就可以真正意义上的并行执行,所以在python中,多进程的执行效率优于多线程(仅仅针对多核CPU而言)。PHP 语言代码本身(大部分情况下)是不关心自身是多进程还是多线程的,这并不表示 PHP 不支持多线程/多进程。php-fpm 就是多进程单线程的,apeche 的多线程模式就是多线程的。PHP 只是一般不会在 PHP 代码级别直接控制进程或者线程,而是以Nginx, php-fpm, php.ini、负载均衡等方式处理多进程问题,虽然这些不是 PHP 代码,但是是与 PHP 相关密切的组合搭配。来看一个常用搭配方式nginx+php-fpm模式:1.当客户端发送一个请求时,web server会通过一个php-fpm进程(这里和下文所说指的fpm进程都是fpm开启的worker进程,关于fpm的工作原理这里不再累述)去执行php代码,php代码的执行是单线程的。2.当有多个客户端同时发送请求时(并发),web server就会为每个请求开启一个php-fpm进程去执行php代码。3.请求执行过后,对应的php-fpm进程被销毁,内存得以释放。4.而并发的问题在于,在某一时间,客户端请求让php-fpm进程数量达到了最大限制数,这个时候,新来的请求只能等待空闲的php-fpm来处理,这就是多进程同步阻塞模式的弊端,当然还有进程过多所带来的内存占用问题。总结:1.PHP是依靠Nginx、php-fpm、负载均衡等方式处理并发多进程问题。2.Python依靠本身的thread 库及multiprocessing 库,多核CPU下多线程效率低下,多进程效率反而更好。3.Java线程和系统线程一一对应,而goroutine和系统线程多对一,Java是调用系统线程来处理多任务,2k个线程就到极限了,同时线程之间的资源共享状态需要码农自己去写,对技术要求很高。4.Go是以goroutine协程方式处理多线程,同时能简单高效的编写非常高性能的并发应用,目前对于性能要求很高的项目都会上Go,所有他们的多线程排名个人认为应该如下:Go>Java>Python>PHP以上是聆云软件对后台语言多维度的分析,有不当之处还请多多指教。

举报/反馈

原创文章 互联网后台开发语言JAVA、PHP、Golang、Python优劣比较,版权所有
如若转载,请注明出处:https://www.itxiaozhan.cn/202210725.html

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注