Is ScriptEngine
of Scala
thread-safe? This is from Scala-2.12
based implementation:
import java.util.concurrent.Executors
import javax.script._
import scala.concurrent.duration._
import scala.concurrent.{Await, ExecutionContext, Future}
object Prac extends App {
val scripter = new ScriptEngineManager().getEngineByName("scala")
val exe = Executors.newFixedThreadPool(100)
implicit val e = ExecutionContext.fromExecutor(exe)
val ans = for {
x <- 1 to 100
} yield Future {
val bindings = scripter.createBindings()
bindings.put("x", x)
val script = scripter.eval(
"""
def sqrt(n:Int) = math.sqrt(n)
sqrt(x.asInstanceOf[Int])
""".stripMargin, bindings)
require(script == math.sqrt(x))
println(x+" - " + script)
}
Await.result(Future.sequence(ans), 20 seconds)
}
The above fails if run in parallel. Runs perfectly fine if run sequential.
As per this tweet confirmation by Adriaan Moors, it is not thread-safe.