Ich habe eine Sequenz bekommt deckeln (von File.walkTopDown) und ich brauche eine lang andauernde Operation auf jeden von ihnen laufen. Ich würde gerne Kotlin-Best-Practices/-Coutines verwenden, aber ich bekomme entweder keine Parallelität oder viel zu viel Parallelität und treffe einen IO-Fehler "zu viele offene Dateien".wie Kotlin Koroutinen maximale Concurrency
File("/Users/me/Pictures/").walkTopDown()
.onFail { file, ex -> println("ERROR: $file caused $ex") }
.filter { ... only big images... }
.map { file ->
async { // I *think* I want async and not "launch"...
ImageProcessor.fromFile(file)
}
}
Dies scheint nicht parallel zu laufen, und meine Multi-Core-CPU geht nie über 1 CPU Wert. Gibt es einen Weg mit Coroutinen, um "NumberOfCores-Paralleloperationen" im Sinne von "Deferred Jobs" durchzuführen?
Ich schaute auf Multithreading using Kotlin Coroutines, die zuerst alle Jobs erstellt, dann verbindet sie, aber das bedeutet, die Sequenz/Datei Baum gehen komplett vor der schweren Verarbeitung Join Schritt, und das scheint ... iffy! Wenn man sie in einen Sammel- und einen Prozessschritt aufteilt, könnte die Sammlung der Verarbeitung weit voraus sein.
val jobs = ... the Sequence above...
.toSet()
println("Found ${jobs.size}")
jobs.forEach { it.await() }
Ich dachte, das würde funktionieren, aber es scheint immer noch das Finale forEach sequentiell zu verarbeiten. z.B. .map {Datei -> async (CommonPool) { println ("Start") val img = ImageFile.fromFile (Datei) println ("end") img } } .forEach { imageFiles.add (it.await()) if (Math.random()> 0.999) { imageFiles.save() } } –
Oh, Snap, Sie haben Recht. Jetzt denke ich, dass es keine Möglichkeit gibt, dies mit Sequenzen zu tun. Bearbeitete die Antwort – voddan