【发布时间】:2013-10-26 01:23:31
【问题描述】:
我想在 Scala 中结合使用反射和并行处理,但我被 reflection's lack of thread safety 所困扰。 所以,我正在考虑只在自己的进程(而不是线程)中运行每个任务。 有什么简单的方法可以做到这一点?
例如,有没有办法配置.par 使其生成进程,而不是线程?还是有一些函数fork 接受闭包并在新进程中运行它?
编辑:期货显然是一个不错的选择。 但是,我仍然需要弄清楚如何在单独的进程中运行它们。
编辑 2:即使使用 Akka 的“fork-join-executor”调度程序,我仍然遇到并发问题,这听起来确实应该是分叉进程。但是,当我在 Futures 中运行 ManagementFactory.getRuntimeMXBean().getName() 时,似乎一切都在同一个进程中。
这是检查实际进程级并行性的正确方法吗?
我是否使用了正确的 Akka 调度程序?
编辑 3:我意识到反射很糟糕。不幸的是,它在我需要的库中使用。
【问题讨论】:
-
听起来大多数与缺乏线程安全性相关的反射问题都可以通过在每个线程上使用单独的类加载器来解决。其他人对此有什么想法吗?
-
如果您是 Scala 的新手,您几乎可以肯定不希望通过反射来解决编程或设计问题。 Scala 编程和设计的一个非常重要的原则是静态类型。你应该知道“预先”(当你编写代码时)你的程序在输入什么类型。所谓的“动态类型”是一种含糊不清的说法,“你知道我的意思,编译器,对吧?”最终会适得其反的编程,至少在大型系统中是这样。避免它!
-
可以发布一个示例代码来演示该问题吗?
标签: scala concurrency akka