Portál AbcLinuxu, 30. dubna 2025 13:48
pull based přístupu scalaz-stream (následující články řetězu tahají data od předchozích)Ano, scalaz-stream je pull based. Push lze nasimulovat například pomocí fronty:
val p = (Process(1, 2, 3).toSource ++ eval_(Task.delay(println("print")))).repeat val processItem: Sink[Task, Int] = io.stdOutLines.contramap(_.toString) // Vytvorime frontu. val q = async.unboundedQueue[Int] // Prvky produkovane procesem p posleme do fronty. p.to(q.enqueue).run.runAsync(x => println("enqueue end")) // q.dequeue je proces prvku z fronty. // Prvky z fronty posilame do Sinku processItem, ktery prvky zpracovava. // Az jsou prvky zpracovany (nebo po vyhozeni vyjimky) frontu zavreme // -- zavreni fronty zajisti ukonceni procesu, jenz dava prvky do fronty // -- tj. ukonceni p.to(q.enqueue).run.runAsync(x => println("enqueue end")). (q.dequeue.to(processItem).take(2) onComplete eval_(q.close)).run.runKód obvykle několikrát vypíše řetězec print – počet vypsaných řetězců print závisí na tom, jak rychle se prvky produkované
p
posílají do fronty q
. Kromě neomezené fronty async.unboundedQueue
existuje i omezená fronta async.boundedQueue
.
A jaký je vlastně rozdíl mezi pull-based přístupem a obyčejnými streamy?Myslím, že obyčejné streamy jsou také pull based.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.