对于多玩家编程游戏,我正在为Scala开发一个后台编译服务器,它支持编译由玩家提交的多个独立源树。通过实例化Global
编译器对象,我成功地运行了快速的顺序编译而无需重新加载编译器
val compilerGlobal = new Global(settings, reporter)
然后通过
运行单个编译作业val run = new compilerGlobal.Run
run.compile(sourceFilePathList)
我现在理想地想要并行化服务器(即同时进行多个编译),但每次都不需要重新加载编译器(主要是为了避免重新解析lib)。这是可能的,即上面显示的第二部分(安全地:-)重入,还是保持全局状态?如果没有,我还能尝试别的吗?我目前专注于支持Scala 2.9.1。
答案 0 :(得分:4)
是的,编译器运行共享状态,因此不应在线程之间共享它们。这是Eclipse插件中出现的问题之一。正如@EJP所指出的,符号表是共享的。
这在您的情况下并不那么重要,但是在IDE中出现:编译器在类型中使用惰性,这意味着在Symbol
上调用方法时可能会发生额外的计算(和变异)。由于可见性问题,在与创建它们的相同的线程上调用这些方法非常重要。