En dépit du prochain framework fork/join de java 7, je construis une méthode d'aide qui est légère dans la syntaxe pour que le client exécute du code en parallèle. Voici une méthode principale exécutable pour illustrer l'idée.Une syntaxe de jointure de fourche Scala légère
import actors.Futures
object ForkTest2 {
def main(args: Array[String]) {
test1
test2
}
def test1 {
val (a, b, c) =fork({
Thread.sleep(500)
println("inside fx1 ",+System.currentTimeMillis)
true
}, {
Thread.sleep(1000)
println("inside fx2 ",+System.currentTimeMillis)
"stringResult"
}, {
Thread.sleep(1500)
println("inside fx3 ",+System.currentTimeMillis)
1
})
println(b, a, c)
true
}
def test2 {
val results = forkAll({
() =>
Thread.sleep(500)
println("inside fx1 ",+System.currentTimeMillis)
true
}, {
() =>
Thread.sleep(1000)
println("inside fx2 ",+System.currentTimeMillis)
"stringResult"
}, {
() =>
Thread.sleep(1500)
println("inside fx3 ",+System.currentTimeMillis)
1
}, {
() =>
Thread.sleep(2000)
println("inside fx4 ",+System.currentTimeMillis)
1.023
})
println(results)
true
}
val tenMinutes = 1000 * 60 * 10
def fork[A, B, C](
fx1: => A,
fx2: => B,
fx3: => C
) = {
val re1 = Futures.future(fx1)
val re2 = Futures.future(fx2)
val re3 = Futures.future(fx3)
//default wait 10 minutes
val result = Futures.awaitAll(tenMinutes, re1, re2, re3)
(
result(0).asInstanceOf[Option[A]],
result(1).asInstanceOf[Option[B]],
result(2).asInstanceOf[Option[C]]
)
}
type fxAny =() => Any
def forkAll(
fx1: fxAny*
): List[Any] = {
val results = fx1.toList.map {fx: fxAny => Futures.future(fx())}
Futures.awaitAll(tenMinutes, results: _*)
}
}
un échantillon eteint est
(inside fx1 ,1263804802301)
(inside fx2 ,1263804802801)
(inside fx3 ,1263804803301)
(Some(stringResult),Some(true),Some(1))
(inside fx1 ,1263804803818)
(inside fx2 ,1263804804318)
(inside fx3 ,1263804804818)
(inside fx4 ,1263804805318)
List(Some(true), Some(stringResult), Some(1), Some(1.023))
test 1 illustrent un type sûr type de retour
test 2 illustrent un argument d'entrée arbitraire
j'espère combiner la méthode à deux test Ainsi, le code client peut exécuter une fonction arbitraire en parallèle avec le type de retour sécurisé.
Un autre point sur les arguments de la fonction arbitraire est:
Je pense que la ligne
type fxAny =() => Any
devrait vraiment être code comme
type fxAny = => Any
, mais le compilateur scala ne me permettent pas de fais-le.
Toute aide est appréciée.
Vous pouvez définir ce encore plus court: implicite def anyToFun0 [T] (t: => T): (() => T) =() => t (http://stackoverflow.com/questions/1826145/how-to-write-a-lazy-variable-argument-version-of-orelse/1826794#1826794). Le problème est que vous ne serez pas en sécurité. Vous devez définir une fonction ou une valeur paresseuse. Un bloc sera évalué. –
la fonction implicite ferait que le fx soit évalué et invoqué. Le client doit explicitement appeler la conversion de type pour éviter une évaluation précoce – laiBilly