并发已不再是语言层面上的事情了

简介:

原文链接  译者:张军 校对:方腾飞

本文将并发和内存管理做了个类比。最近有一个说法是因为现代工程师几乎总是面对计算机集群编程,所以我们需要用于构建分布式系统的工具。这就意味着我们需要在语言层面支持分布式系统开发。像GO和Erlang这样的语言其优势正好符合这个观点。

GO和Erlang可能最终会流行,但我不认为是这个原因。分布式系统开发并不会成为每个应用开发者日常工作的一部分,因为那将会是件非常痛苦的事情。在某种程度上,我想今天发生的事情是因为缺乏良好的分布式计算框架,而迫使应用去重新实现一些分布式系统原语。但这种情况不会一直存在,而必将有一些框架提供不同的编程模型,在弹性机器池上处理分布和并发问题。

MapReduce已经解决了这个问题。MapReduce编程几乎都是单线程的,并发是由框架来管理,另外有助于你写好MapReduce程序的原因是,有很多用户级别(user-level)的并发原语,并且MapReduce是高度并行的。

这不是个新事物,即使是Java servlets,其所有的缺陷主要是因为抽象了线程模型,但是至少对于应用程序来说只需要通过阻塞I/O与一个数据库进行交互。

我觉得有三大基本领域需要处理:在线,近实时和离线。

  • 在线领域,我们创建请求/响应式服务,并行性是通过将每个请求的处理当作一个工作单元,划分到不同的线程和机器。我见过该模型的多个变种,从“服务查询语言”到将REST调用拼接在一起的DSLs,它们的共同点就是抽象并发的处理,而不需要像线程一样直接访问单个服务器的并发机制。
  • 在近实时处理领域,流处理框架做的很好,通过异步处理而根本不用考虑并发。而且你关心的并发和并行只在框架层面,你写的代码看起来完全是单线程的。
  • 离线领域似乎为了不同的目标朝着YARN框架 (校对注:YARN框架介绍)的方向发展。

几乎所有这些框架的共同点是它们都不需要用户直接管理并发。

我认为这些高层次的领域(在线,异步和离线)将被证明会长期存在,但是我不认为我们需要十几个基础分布式计算框架来涵盖这些领域。

这让我花了很多时间来思考,在语言层面支持单机并发(软件事务内存和其他)效果是有限的。它只会帮助框架的实现者而不是最终用户。相比应用开发者,框架实现者会有一些非常不同的需求,他们更关心性能和细粒度的控制。尽管这显然是一个有争议的说法,我不确定线程和锁对框架开发者来说是否是一个可行的模型,毕竟,对于一个受训过的团队它们做的非常好,并有出色的性能和控制能力。 

目录
相关文章
|
24天前
|
监控 Java 测试技术
Java并发编程最佳实践:设计高性能的多线程系统
Java并发编程最佳实践:设计高性能的多线程系统
36 1
|
12天前
|
监控 Java 开发者
【并发编程的终极简化】JDK 22结构化并发:让并发编程变得像写代码一样简单!
【9月更文挑战第8天】随着JDK 22的发布,结构化并发为Java编程带来了全新的并发编程体验。它不仅简化了并发编程的复杂性,提高了程序的可靠性和可观察性,还为开发者们提供了更加高效、简单的并发编程方式。我们相信,在未来的发展中,结构化并发将成为Java并发编程的主流方式之一,推动Java编程语言的进一步发展。让我们共同期待Java在并发编程领域的更多创新和突破!
|
2月前
|
消息中间件 JavaScript Java
关于如何提高Web服务端并发效率的异步编程技术
【7月更文挑战第4天】异步编程技术是提升Web服务并发效率的关键。包括: 1. 事件驱动编程,如Node.js的事件回调; 2. 异步任务队列,利用消息队列如RabbitMQ或Kafka解耦处理; 3. 异步I/O,Java的CompletableFuture实现非阻塞操作; 4. 协程,Python的async/await提供同步感的异步执行; 5. 线程/进程池,通过固定资源池管理并发任务,减少系统开销。 这些技术能增强系统性能和响应速度。然而,异步编程也需考虑正确性、稳定性和调试挑战。
|
2月前
|
存储 Java 调度
线程操纵术并行策略问题之Java的并行编程优势问题如何解决
线程操纵术并行策略问题之Java的并行编程优势问题如何解决
|
2月前
|
设计模式 并行计算 安全
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
38 0
|
2月前
|
设计模式 安全 Java
Java面试题:如何实现一个线程安全的单例模式,并确保其在高并发环境下的内存管理效率?如何使用CyclicBarrier来实现一个多阶段的数据处理任务,确保所有阶段的数据一致性?
Java面试题:如何实现一个线程安全的单例模式,并确保其在高并发环境下的内存管理效率?如何使用CyclicBarrier来实现一个多阶段的数据处理任务,确保所有阶段的数据一致性?
42 0
|
2月前
|
Java 测试技术 容器
多线程编程基础与并发问题解决方案
多线程编程基础与并发问题解决方案
|
4月前
|
存储 算法 编译器
C++性能调优:从代码层面提升程序效率
本文探讨了C++程序性能调优的关键点:选择合适的数据结构和算法,例如用哈希表(如`std::unordered_map`)替换低效的数组或链表;减少不必要的内存分配和释放,利用智能指针和容器如`std::vector`自动管理内存;优化循环和条件语句,例如在循环外存储数组大小;利用编译器优化如`-O2`或`-O3`;以及使用性能分析工具如`gprof`、`callgrind`和`perf`识别并解决性能瓶颈。通过这些方法,可以有效提升C++程序的运行效率。
|
4月前
|
监控 Java 编译器
Go语言内存与并发性能综合优化策略
【2月更文挑战第11天】Go语言以其高效的并发处理能力和简洁的内存管理机制成为了现代软件开发中的热门选择。然而,在实际应用中,如何综合优化Go程序的内存使用和并发性能,仍然是一个值得探讨的话题。本文将深入探讨Go语言内存与并发性能的综合优化策略,包括内存布局优化、并发模式设计、资源池化以及性能监控与分析等方面,旨在帮助开发者全面提升Go程序的整体性能。
|
架构师
架构系列——架构师必备基础:并发、并行与多线程关系
架构系列——架构师必备基础:并发、并行与多线程关系