Implicits.global vs Implicits.defaultContext
Scala Future
需要放在执行上下文(线程池)中执行,一般常见的线程池有2种:
Scala Execution Context
:
|
|
该线程池是由Scala
标准库提供的,它是一种特殊的ForkJoinPool
线程池,在高负载时,使用的线程可能比优化时多(对比play
或者akka framework
),因此性能可能会降低
Play Default Execution Context
:
|
|
该线程池是由play提供,play应用应该使用这种执行上下文。同时,应该避免阻塞操作放入play execution context
,好的办法是放入其他的execution context
,避免play应用资源用尽。
注意:理解哪个线程运行了future
非常重要,导入play的默认执行环境(execution context
)。这是一个隐式(implicit
)的参数,会被传入所有接受回调的future API
方法中。执行环境(execution context
)通常等价于线程池,但这并不是一定的。
简单的把同步IO封装入Future
并不能将其转换为异步的。如果你不能通过改变应用架构来避免阻塞操作,那么该操作总会在某一时刻被执行的,而相应的线程则会被阻塞。所以,除了将操作封装于Future
中,还必须让它运行在配置了足够线程来处理可预计并发的独立执行环境(execution context
)中。更多信息请见理解Play线程池
参考
https://stackoverflow.com/questions/30805337/plays-internal-execution-context