Ho pensato che usare i futures mi avrebbe permesso facilmente di sparare blocchi di codice, ma a quanto pare posso avere solo 4 futures alla volta.Posso fare solo 4 futures simultanei come massimo in Scala
Da dove viene questa restrizione o sto abusando di Futures usandolo in questo modo?
import scala.concurrent._
import ExecutionContext.Implicits.global
import scala.util.{Failure, Success}
import java.util.Calendar
object Main extends App{
val rand = scala.util.Random
for (x <- 1 to 100) {
val f = Future {
//val sleepTime = rand.nextInt(1000)
val sleepTime = 2000
Thread.sleep(sleepTime)
val today = Calendar.getInstance().getTime()
println("Future: " + x + " - sleep was: " + sleepTime + " - " + today)
1;
}
}
Thread.sleep(10000)
}
uscita:
Future: 3 - sleep was: 2000 - Mon Aug 31 10:02:44 CEST 2015
Future: 2 - sleep was: 2000 - Mon Aug 31 10:02:44 CEST 2015
Future: 4 - sleep was: 2000 - Mon Aug 31 10:02:44 CEST 2015
Future: 1 - sleep was: 2000 - Mon Aug 31 10:02:44 CEST 2015
Future: 7 - sleep was: 2000 - Mon Aug 31 10:02:46 CEST 2015
Future: 5 - sleep was: 2000 - Mon Aug 31 10:02:46 CEST 2015
Future: 6 - sleep was: 2000 - Mon Aug 31 10:02:46 CEST 2015
Future: 8 - sleep was: 2000 - Mon Aug 31 10:02:46 CEST 2015
Future: 9 - sleep was: 2000 - Mon Aug 31 10:02:48 CEST 2015
Future: 11 - sleep was: 2000 - Mon Aug 31 10:02:48 CEST 2015
Future: 10 - sleep was: 2000 - Mon Aug 31 10:02:48 CEST 2015
Future: 12 - sleep was: 2000 - Mon Aug 31 10:02:48 CEST 2015
Future: 16 - sleep was: 2000 - Mon Aug 31 10:02:50 CEST 2015
Future: 13 - sleep was: 2000 - Mon Aug 31 10:02:50 CEST 2015
Future: 15 - sleep was: 2000 - Mon Aug 31 10:02:50 CEST 2015
Future: 14 - sleep was: 2000 - Mon Aug 31 10:02:50 CEST 2015
Mi aspettavo che tutti mostrano allo stesso tempo.
Per dare un contesto, pensavo di poter usare questo costrutto ed estenderlo avendo un ciclo principale, nel quale esso dorme ogni ciclo secondo un valore tratto da una distribuzione esponenziale, per emulare l'arrivo/esecuzione dell'utente di una query . Dopo ogni sospensione mi piacerebbe eseguire la query inviandola al driver del programma (in questo caso Spark, e il driver consente l'uso di più thread). C'è un modo più ovvio di usare Futures?
In quest'ultimo caso con newSingleThreadExecutor ti imbatti ancora nel fatto che un futuro può bloccare il successivo. È persino peggio del default. – hbogert
@hbogert hai posizionato 'Executors.newSingleThreadExecutor' prima del' Future'? Ho aggiornato la domanda quindi per favore dai un'occhiata. – ymonad
per impostazione predefinita, crea effettivamente pool fork-join, non solo pool fisso – dk14