Jak opisano akka streams documentation że próbował utworzyć pulę robocze (przepływów)siły roboczej o Akka strumieni
def balancer[In, Out](worker: Flow[In, Out, NotUsed], workerCount: Int): Flow[In, Out, NotUsed] = {
import GraphDSL.Implicits._
Flow.fromGraph(GraphDSL.create() { implicit b =>
val balancer = b.add(Balance[In](workerCount))
val merge = b.add(Merge[Out](workerCount))
for (_ <- 1 to workerCount) {
balancer ~> worker ~> merge
}
FlowShape(balancer.in, merge.out)
})
}
wtedy używane tej funkcji do prowadzenia przepływu równolegle:
def main(args: Array[String]) {
val system = ActorSystem()
implicit val mat = ActorMaterializer.create(system)
val flow = Flow[Int].map(e => {
println(e)
Thread.sleep(1000) // 1 second
e
})
Source(Range.apply(1, 10).toList)
.via(balancer(flow, 3))
.runForeach(e => {})
}
Otrzymuję oczekiwane wyjście 1, 2, 3, 4, 5, 6, 7, 8, 9
, ale liczby pojawiają się z prędkością 1 na sekundę (brak równoległości). Co robię źle?
co kontekst wykonanie? Jeśli używasz puli wątków o ustalonej wielkości, jest to normalna –
Oznacza to, że domyślny rozmiar kontekstu wynosi 1? Czy mógłbyś podać jaki jest preferowany sposób konfiguracji kontekstu wykonania? – Mihai238
Brak domyślnego kontekstu nie jest ustalony, prawdopodobnie importujesz globalny niejawny kontekst, który będzie zależał od zbyt dużej rzeczy jak wersja, możesz spróbować 'niejawny val ec = ExecutionContext.fromExecutor (Executors.newFixedThreadPool (10))' –