对于一个多玩家编程游戏,我正在为Scala开发一个后台编译服务器,它支持对玩家提交的多个独立源码树进行编译。通过实例化Global编译器对象,我成功地运行了快速、连续的编译,而无需重新加载编译器
val compilerGlobal = new Global(settings, reporter),然后运行单独的编译作业。
val run = new compilerGlobal.Run
run.compile(sourceFilePathList)理想情况下,我现在希望将服务器并行化(即同时运行多个编译),但仍然不需要每次从头开始重新加载编译器(主要是为了避免重新解析库)。这是可能的吗,即上面显示的第二部分(安全:-)是可重入的,还是保持全局状态?如果没有,还有什么我可以尝试的吗?我目前专注于支持Scala 2.9.1。
发布于 2012-04-08 05:21:43
是的,编译器运行共享状态,所以你不应该在线程之间共享它们。这是Eclipse插件中出现的问题之一。正如@EJP所指出的,符号表是共享的。
这在你的例子中并不重要,但在集成开发环境中会出现:编译器在类型中使用惰性,这意味着在Symbol上调用方法时可能会发生额外的计算(和突变)。由于可见性问题,在创建这些方法的线程中调用这些方法是很重要的。
https://stackoverflow.com/questions/9961967
复制相似问题