gpt4 book ai didi

java - 多核性能如何与 Scala 中的执行上下文和线程池相关

转载 作者:行者123 更新时间:2023-11-29 04:43:01 24 4
gpt4 key购买 nike

所以我有一个现有的 Spring 库,它执行一些阻塞任务(公开为服务),我打算使用 Scala Futures 包装这些任务以展示多处理器功能。目的是让人们对 Scala/Akka 技术堆栈感兴趣。

这是我的问题。可以说我从现有的 Spring 库中获得了两项服务。这些服务执行不同的阻塞任务(IO、数据库操作)。我如何确保这些任务(服务调用)是跨多个核心执行的?例如,我如何使用自定义执行上下文?每次服务调用都需要一个吗?执行上下文/线程池如何与多核操作相关?

感谢任何对此理解的帮助。

最佳答案

您无法确保任务将在不同的核心上执行。示例程序的工作流就是这样。

  1. 编写一个程序,在两个不同的线程(Futures、Java 线程、Actor,随便你怎么说)上做两件事。
  2. JVM 发现您需要两个线程,因此它启动两个 JVM 线程并将它们提交给操作系统进程调度程序(或其他反过来,没关系)。
  3. 操作系统决定每个线程在哪个内核上执行。通常,它会尝试将线程放在不同的核心上以最大化整体效率但并不能保证;您可能会遇到 10 个 JVM 线程将在一个内核上执行的情况,尽管这是极端情况。

编写并发和看似并行的应用程序的经验法则是:“在这里,拿我的 10 个线程,然后尝试将它们分配给核心。”

有一些技巧,例如调整 CPU 亲和性(低级别,风险很大)或产生过多的线程以确保它们是并行的(GC 的大量开销和工作)。但是,一般来说,操作系统通常不会重载,如果您创建两个,例如参与者,一个用于数据库,一个用于网络 IO,他们应该并行工作。

更新:全局 ExecutionContext 管理线程池。但是,您可以定义自己的并向其提交可运行对象 myThreadPool.submit(runnable: Runnable)。查看评论中提供的链接。

关于java - 多核性能如何与 Scala 中的执行上下文和线程池相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38394341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com