ã¢ããªã±ã¼ã·ã§ã³ã«åã£ãExecutionContextã使ã
scalaã§ã¯Futureãªã©ã®è£å´ã§ã¯ExecutionContextãåãã¦ãã¾ããã¨ãããã¨ã¯ExecutionContextã®ä½¿ãæ¹ããã¾ãã¡ã ã¨Futureå¨ãã§åé¡ãèµ·ãããã¨ã«ãªãã¾ãã
ããèµ·ããåé¡ã®1ã¤ã¨ãã¦ãæ¨æºã®ExecutionContextããã¾ãã¡ã ã£ããã¨ããã®ãããã¨æãã¾ãã æ¨æºã®ExecutionContextã¯ãã¡ã¨ããããé©ããªããã¿ã¼ã³ãããã®ã§ããããã¾ãããèæ ®ãããã«ä½¿ããã¦ãã¾ãå°è±¡ãããã¾ãã ã¾ãæªãã®ã¯ã³ã³ãã¤ã©ã®è¦ªåãããã¨ã©ã¼ã¡ãã»ã¼ã¸ã§ãããã
scala> import scala.concurrent.Future import scala.concurrent.Future scala> Future { 1 + 1 } <console>:9: error: Cannot find an implicit ExecutionContext. You might pass an (implicit ec: ExecutionContext) parameter to your method or import scala.concurrent.ExecutionContext.Implicits.global. Future { 1 + 1 } ^ scala> import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.ExecutionContext.Implicits.global scala> Future { 1 + 1 } res2: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@2bbaf4f0 scala> res2.foreach(println) 2
ãã®ããã«Scalaã§Futureã使ããã¨ããã¨ãExecutionContextããªãããimport scala.concurrent.ExecutionContext.Implicits.globalãã©ãã¨ãè¨ãããã®ã§ãã¨ãããã使ã£ã¨ããã¼ã¿ãããªæ°åã«ãªã£ã¡ããã¾ãã
æ¨æºã®ExecutionContextã®ç¹å¾´
ã¾ããæ¨æºã®ExecutionContextã¯ã¹ã¬ããæ°ããããªã«å¤ãããã¾ããã2.11ã§ã¯æå¤§ã§ãã³ã¢æ°åã®ã¹ã¬ããããç«ã¡ä¸ããã¾ããã ããã§ã¯ãããããã¯ãèµ·ããããã®ã§2.12ã§ã¯ã³ã¢æ°+256ã¾ã§ã¨ãªã£ã¦ããããã§ãããç¨éã«ãã£ã¦ã¯ãã£ã¨å¢ããããã§ããã
ãããããæ¨æºã®ExecutionContextã¯ForkJoinPoolã使ã£ã¦å®è£ ããã¦ãã¾ããForkJoinPoolã¯
It is designed for work that can be broken into smaller pieces recursively
https://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html
ã¨ã®ãã¨ã§ãparallel collectionã¨ãã«ã¯åãã¦ããã ãã©Webã¢ããªã±ã¼ã·ã§ã³ã¨ãã«ã¯åããªããã§ããï¼ãã¡ã£ã¦ãã¨ããªãã ãããã©ï¼ã ã¿ãªããã®ç¨éã«ã¯åã£ã¦ãã§ããããï¼
ã¢ããªã±ã¼ã·ã§ã³ã«åã£ãExecutionContextã使ã
æ¨æºã®ExecutionContextããã¿ããã«ä½¿ãã®ã¯ããã¦ãã¢ããªã±ã¼ã·ã§ã³ã«åã£ãExecutionContextã使ãã¾ãããã ä½ãæ¹ã¯ExecutionContext.fromExecutor, ExecutionContext.fromExecutorServiceã使ãã°java.util.concurrentã§ä½ã£ãExecutor/ExecutorServiceãå ã«ExecutionContextãä½ããã§å¤§æµäºè¶³ããæ°ããã¾ãã
Futureã使ãæã«Javaã®ExecutorServiceãå©ç¨ãã - CLOVER
ãã¬ã¼ã ã¯ã¼ã¯ã使ã£ã¦ããå ´åã¯ãã¬ã¼ã ã¯ã¼ã¯ãç¬èªã®ã¹ã¬ãããã¼ã«ãç¨æãã¦ãããã¨ãããã¾ãã
Playã®å ´åã¯akkaã®ã¹ã¬ãããã¼ã«ãå©ç¨ãã¦ãã¦ãimport play.api.libs.concurrent.Execution.Implicits._
ãããã¨ã§æå¹ã«ãªãã¾ãã
ãããããããã¥ã¡ã³ãã®ã¹ã¬ãããã¼ã«ã«ã¤ãã¦ã®ç®æã¯å¿
èªã§ãã
ã©ã¤ãã©ãªã®ã³ã¼ãã«æ¨æºã®ExecutionContextãå«ããªã
Futureãªã©ãç¨ããã©ã¤ãã©ãªãä½ãã¨ãã¯ãæ¨æºã®ExecutionContextããã¼ãã³ã¼ãããªãããã«æ³¨æãã¦ãã ããã ExecutionContextã¯ã¡ã½ããã®å¼æ°çµç±ã§æ¸¡ããªã©ããªãããã®å½¢ã§å©ç¨è ã調æ´ã§ããããã«ãã¾ãããã
ã¾ã¨ã
Scalaã§ã¯Futureãªã©ã®ãããã§æ°è»½ã«éåæå¦çãªã©ãå©ç¨ããã¾ããããã®è£ã«ã¯ã¹ã¬ãããã¼ã«ã§ããExecutionContextããã¾ãã ããããExecutionContextã¯implicitãã©ã¡ã¼ã¿ã¨ãã¦æé»ã®ãã¡ã«å¼ãåãããããããããæªãããã¾ãæèããã¾ãããå°ã£ãããã§ããã
ExecutionContextã¤ãã¦ã¯ãã®å®è£ ãè¦ã¦ã¿ããã¨ãåèã«ãªãã¾ããããã¯ãJavaã®ã¹ã¬ããå¨ãã®ç¥èãä¸å¯æ¬ ã§ãã Scalaãå§ããããã©Javaã¯ããåãããªãã¨ãã人ã¯java.util.concurrentï¼ä¾¿å©ï¼ã®ä½¿ãæ¹ãå¦ãã§ããã¨é°å²æ°ãã¤ãããããªã¨æãã¾ããã