并发编程语言有哪些

并发编程语言有:1、单进程解释语言;2、共享内存的多线程语言;3、Erlang;4、Golang。单进程解释语言包括python, ruby, node.js等,这类解释语言通常提供极高的开发效率,和相对较差的执行效率,在多核与并发的世界,它们不提供任何支持。

并发编程语言有哪些-Worktile社区

1、单进程解释语言

单进程解释语言包括python, ruby, node.js等,这类解释语言通常提供极高的开发效率,和相对较差的执行效率,在多核与并发的世界,它们不提供任何支持。执行一段代码时,无法使用到第二个cpu内核。所以执行这类语言开发的服务,想要利用所有的cpu,只能依靠架构和部署。

在多核和集群的环境下,这类语言的部署是类似的,就是启动多个进程,各自独立地响应服务请求,来提升系统整体的并发吞吐能力,对外接口方面,需要硬件或者软件的负载均衡代理层。如果有进程内的可变缓存对象,开发时需要考虑数据同步。

2、共享内存的多线程语言

共享内存的多线程语言java, .net等,这类语言在设计之初都注重性能,具有较高的执行效率。在单核的年代,他们提供了创建操作系统线程的能力,可以在一个运行进程内,充分利用cpu的运算能力(当一个空闲线程等待时,其它的线程可以运行)。当多核cpu发明以后,那些支持多线程的软件,自动就具有了支持多核的能力。然而多核出现是在这类语言发明之后,真正的并发执行发生后,原先单核环境下不会发生的问题暴露出来,于是java和.net纷纷升级语言,提供补丁,以更好的支持多核并发的环境。

那么,并发执行暴露出来的是什么问题。通常是因为并发执行的进程访问了共享的内存,由于读写的次序不可预料,会产生不可预料的结果。怎么解决这个问题,java和.net提供的方法是加锁,就是到一个进程(线程)访问共享内存时,不允许其它进程(线程)访问。写加锁的代码对程序员的要求很高,一不小心就会发生死锁,而一旦发生死锁,排查错误非常困难。

在架构方面,在多核的单台服务器环境下,不需要运行多个进程也能提高吞吐能力,简化了部署。在集群环境下,和名列前茅类语言相同。

3、Erlang

Erlang诞生已经二三十年,设计之初,是为集群设计,提供了集群与单机一致的开发方法,从语言层面,消除了单机和集群的差异。用Erlang在单机开发的软件,可以轻松扩展运行在整个集群上。这是架构层面的简化。

Erlang是函数式语言,变量只能赋值一次,然后不可改变,同时,Erlang不允许进程间共享数据,从语言层面避免的并发编程最容易引起的错误。因为进程间不允许共享数据,所以Erlang也不需要加锁解锁的语句,我猜语言本身在底层实现用到了加锁原语,但程序员可以和繁复的锁告别,是足够幸福的。每个进程都可以安全的并发执行,但在进程内部,所有的操作都是串行的。往好处想,既享受到了多核和集群的好处,又避免了产生编程错误的可能,正是目前Erlang持续升温的原因。不足的地方是,不适合某些场景的应用,比如缓存服务,当我有一大块内存提供缓存服务时,只能有一个进程来读写这块内存,无法进一步提升服务性能。

4、Golang

在介绍Golang之前,先总结Erlang适应多核编程的特点:单个服务能利用到多核;进程间不共享内存;进程间用消息通讯,不用加锁机制;进程间可以跨服务器通讯。

之前我们说的名列前茅类语言比如python,不能做到名列前茅点。第二类语言java和.net,不能做到第三点,所有的语言都不能做到第四点(需要额外开发,不能在语言内部支持)。如果以Erlang的思想来写Golang的代码,可以做到1,2,3点。你大概能知道Golang是怎么回事了。

Go语言的特色是,很多事情你都“可以”做。可以进程间使用消息管道来替代锁,也可以使用锁。可以使用函数式编程,也可以使用面向对象开发。可以共享内存,当然开发人员可以选择不共享内存。可以方便创建多个进程来并发执行,也可以指定非常多的并发数目,限制cpu资源消耗。

参考Erlang的设计思想,我们开发Go语言应用时,可以做到“1”和“3”,便利地使用多核来提高性能,同时降低开发门槛。在我们《架构篇》中提到的场景,网页服务的场景可以做到“2”,进程间不共享内存;而缓存服务的场景,我们可以使用多进程来访问读取共享缓存,提高吞吐能力,而同时保证只存在一个进程,来修改共享缓存,避免写入冲突。

注意,这里有个边界状况,你需要留意,而我在这里忽略了。也就是写入操作完成一半时,可能被读取进程读到不完整的数据,在我这里的场景,并不太在乎。如果一定要保证读取数据一致,将不得不引入加锁机制,这是多么可怕。

延伸阅读:

Erlang语言的目标

Erlang是一种面向并发运行环境的通用编程语言。该语言由爱立信公司在1986年开始开发。设计之初,Erlang的开发者着眼于找到一种适用于开发大型电信交换设备的编程语言,即达到以下目标:

大规模并发处理与分布式计算能力

同时处理大量的并发业务(例如同时处理上百万个电话呼叫);必须及时并在特定短的时问内完成业务处理;适用于大规模的分布式处理系统,并不断与硬件进行交互;

用于开发高可靠性、高质量的电信产品

连续数年的不间断运行;对软件系统所进行的维护操作(如配置修改、升级等)不会中比软件本身的运行;在硬件故障和软件错误发生时具有容错能力,严格地限制故障和错误所波及的范围;

适用于复杂的项目

用于超大规模的软件开发项目(例如数百万行代码);所实现的软件能完成复杂的功能,各特性之问存在大量交互。

该语言随后在爱立信内部的若干电信设备开发项目中得到应用,并逐步完善;1988年底Erlang成为开源语言(开源对爱立信的直接好处是:Erlang语言本身的维护与发展、相关的教育培训等投入不再由爱立信独自承担;在开源社区的看护下可以使Erlang更好地发展,同时爱立信也可以继续享受该语言的成果),但并不广为人知;近年来随着基于互联网的电子商务、即时通讯、云计算、大型网络游戏等应用的发展,以及多核处理器的逐渐兴起,Erlang在大规模并发处理能力和高可靠性方面的优势被越来越多的人所重视,其应用范围有逐渐扩大之势。

文章标题:并发编程语言有哪些,发布者:小编,转载请注明出处:https://worktile.com/kb/p/35309

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小编小编
上一篇 2023年1月11日 下午10:26
下一篇 2023年1月11日 下午10:29

相关推荐

  • 编程要学习那些语言

    Python、JavaScript、Java 是当前最流行的编程语言。Python 因其简洁易读的语法和强大的库支持而广受欢迎,在数据科学、机器学习、网络开发等领域都有广泛应用。它的简洁性使得初学者易于上手,同时它的多功能性也让经验丰富的开发者能够用来构建复杂的系统。 一、PYTHON的普及与应用 …

    2024年5月21日
    21700
  • 编程应该如何自学

    编程自学成功的关键要素包括1、设定明确的学习目标,2、选择合适的学习资源,3、制定学习计划,4、动手实践,5、加入社区,以及6、持续的学习和复习。 其中,设定明确的学习目标尤为重要。明确目标意味着你知道自己想要通过学习编程达到什么样的水平,比如是希望能够构建自己的网站、成为一名数据分析师还是开发手机…

    2024年5月21日
    11200
  • 梯形图编程是什么

    梯形图编程是一种以图形化方式表示控制逻辑的编程方法,主要应用于自动化和控制系统领域。该方法使得逻辑控制过程直观、易理解,能够有效提高系统设计的效率和可靠性。其中,逻辑控制的图形化表现是其最为显著的特点之一。 在梯形图编程中,程序的每一段逻辑都被分解成若干个"梯级",每个梯级代表一…

    2024年5月21日
    8500
  • 为什么要学儿童编程

    在当今这个数字化时代,1、培养逻辑思维、2、增强解决问题的能力、3、激发创造力、4、为未来的职业生涯打基础等都是学习儿童编程的重要原因。培养孩子的逻辑思维尤其重要,因为这种能力是学习任何知识和技能的基础。通过编码,孩子们可以学会如何分析问题、拆解问题,并通过一步一步的逻辑顺序解决问题。这种思维模式在…

    2024年5月21日
    8400
  • 上海什么是少儿编程定制

    上海少儿编程定制是指专门为上海地区的儿童提供个性化、针对性强的编程教育服务。这种服务的核心在于1、满足儿童的个性化学习需求;2、与地方教育资源结合;3、提供符合当地教育标准的教学内容和方案。在上海,少儿编程定制通常涉及软件编程、硬件操控和项目实践,有助于培养孩子们的逻辑思维能力、解决问题能力和创新精…

    2024年5月21日
    6200

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部