如果我在多线程服务器程序中运行并行代码会发生啥? [复制]

Posted

技术标签:

【中文标题】如果我在多线程服务器程序中运行并行代码会发生啥? [复制]【英文标题】:What would happen if I run parallel code in a multi-threading server program? [duplicate]如果我在多线程服务器程序中运行并行代码会发生什么? [复制] 【发布时间】:2019-11-10 07:46:49 【问题描述】:

我大致了解并行计算和并发计算之间的区别。如果我错了,请纠正我。

并行计算

如果一个系统可以支持两个或更多,则称其为并行 同时执行的动作。在并行编程中,效率是 主要问题。

并发计算

如果一个系统可以支持两个或更多,则称其为并发 同时进行中的动作。虽然,多个动作不是 必须在并发编程中同时执行。 在并发编程、模块化、响应性和 可维护性很重要

我想知道如果我在多线程程序中执行并行编程代码会发生什么?在多线程服务器程序中使用 Java 的并行 Stream。

程序真的会更有效率吗?

我最初的想法是这可能不是一个好主意,因为经过某种优化的多线程程序应该已经占用了线程。这里的并行性可能会带来额外的开销。

【问题讨论】:

“服务器”在您的问题中有什么相关性? @Holger 服务器旨在扩展。响应时间至关重要。流量可能会波动。可能是异步的。 @BenR。我不是在比较差异,而是讨论在另一个之上使用一个的效果。 确实,您不是在比较差异。实际上,您问题的前 ⅔ 与问题完全无关。 【参考方案1】:

并发性和并行性之间的关键区别在于,并发性是指同时处理很多事情(给人一种同时性的错觉)或处理并发事件,本质上是隐藏延迟。相反,并行是为了提高速度同时做很多事情。

两者都有不同的需求和用例。

并行性用于实现运行时性能和效率,是的,由于其性质,它会给系统(Cpu、ram 等)增加一些额外的开销。但这是当今多核技术中大量使用的概念。

【讨论】:

【参考方案2】:

我想知道如果我并行执行会发生什么 多线程程序中的编程代码?例如使用 Java 的 多线程服务器程序中的并行流。

基于我对 Java 运行时的有限了解,每个程序都已经是多线程的,应用程序入口点是与其他运行时线程 (gc) 一起运行的 main 线程。

假设您的应用程序产生了两个线程,并在其中一个线程中创建了一个 parallelStream。看起来 parallelStreams api 使用了一个ForkJoinPool.commonPool,它启动了 NUM_PROCESSES - 1 个线程。此时,您的应用程序可能拥有比 CPU 更多的线程,因此如果您的 parallelStream 计算受 CPU 限制,那么您已经在线程上超额订阅 -> CPU。

https://***.com/a/21172732/594589

我不熟悉java,但有趣的是parallelStream 共享同一个线程池。因此,如果您的程序产生了另一个线程并启动了另一个 parallelStream,那么第二个 parallelStream 将与第一个共享底层线程池线程!

根据我的经验,我发现考虑以下几点很重要:

您的应用程序正在执行的工作负载类型(CPU 与 IO) 可用的并发原语类型(线程、进程、绿色线程、epoll aysyncio 等) 您的系统资源(即#CPU 可用) 您的应用程序并发原语如何映射到底层操作系统资源 您的应用程序在任何给定时间拥有的并发原语数

这个程序真的会更有效率吗?

这完全取决于,唯一确定的答案是使用这两种解决方案对您的目标架构/系统进行基准测试。


根据我的经验,对基本模式之外的复杂并发进行推理变得非常困难。我相信这就是那句话:

让它发挥作用,让它正确,让它快速。 ——肯特·贝克

来自。在这种情况下,请确保您的程序是并发安全的(使其正确)并且没有死锁。然后开始测试、基准测试和运行实验。

在我有限的个人经验中,我发现分析在很大程度上分崩离析,除了描述您的应用程序工作负载(CPU 与 IO)并找到一种对其建模的方法,以便您可以横向扩展以以可配置的基准测试方式利用您的系统全部资源.

【讨论】:

以上是关于如果我在多线程服务器程序中运行并行代码会发生啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在多线程 C++11 程序中未处理异常时会发生啥?

如果我在多对多关系中添加相同的 NSManagedObject 会发生啥?

在 Android 中使用 Dispatcher v/s 主线程会发生啥

如果某些线程比其他线程先结束会发生啥?

Python中的多线程并行运行

在线程上多次调用 start() 会发生啥[关闭]