java - 调用 Java/Scala 方法的最早方法是什么?

标签 java scala environment-variables

我使用一些脏代码在 Scala 中设置环境变量 second answer of this question
我在IDE(IDEA Intellij)中对此进行了测试并设置了OMP_NUM_THREADS在我的课开始时。

import org.scalatest.{FlatSpec, Matchers}
class MyTest extends FlatSpec with Matchers {
  val m = Map("OMP_NUM_THREADS" -> "1")
  EnvHacker.setEnv(m)
设置后,我可以从 System.env 读取, 有用。但是当我的程序运行时,它不使用这个。我尝试将它设置在静态块中,但仍然无法正常工作。
但是如果我在 IDE 运行配置中设置它(在 JVM 运行之前),它会按我的预期工作和运行。所以似乎它在我修改变量之前被读取。
或者换句话说,我有一段代码,什么是最早在 Java/Scala 中调用它的方法。例如在 main 方法的第一行之前调用静态块。
更新了一些细节:
我正在使用 tensorflow-mkl Java API,它会读取系统环境变量 OMP_NUM_THREADS有时,根据我的测试结果,此操作是在系统静态块之前。但是,我想在代码中进行控制,因为我不知道没有代码逻辑的预期配置。

最佳答案

我认为这是一个 XY problem :您想通过“OMP_NUM_THREADS”环境控制 OpenMP,但由于某种原因您不能或不想在您的进程中设置实际环境变量?那正确吗?
你是如何调用 OpenMP 的? OpenMP 是一个 C 库 https://www.openmp.org/ ,因此它不会注意到您对 java.lang.ProcessEnvironment#theEnvironment 所做的任何更改字段,无论您设置它多早。
如果您通过 exec 调用 OpenMP调用,那么您应该能够向它传递一个新环境。
如果您通过 JNI 调用 OpenMP,那么您将无法从 Java 更改您的环境变量,您将需要在启动该过程时实际设置 env。见 Can I set an Environment Variable for Java Native Interface (JNI) libraries?
你能不能改用 omp_set_num_threads()而不是 OMP_NUM_THREADS环境?

关于java - 调用 Java/Scala 方法的最早方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67563499/

相关文章:

java - Android - 将现有应用程序作为库项目添加到另一个应用程序

java - 求两个数之间的平方根

scala - Doobie for Scala/Play 框架中的事务

scala - Play 框架使用 SOAP 网络服务

jenkins - 防止扩展 Jenkins 作业参数中的环境变量

java - 使用 Spring Boot 编写 Spring Batch

scala - scala 中的逆变

无法将文件名分配给vim中的环境变量

reactjs - 将 .env 文件添加到 React 项目

java - Kafka 流到主题