2016-07-12 52 views
2

我想知道在FS2中實現Object Pool pattern的最佳方法是什麼。與FS2的對象池模式

比方說,我們有以下MyPrinter定義:

class MyPrinter { 
    import scala.util.Random.nextInt 
    Thread.sleep(5000 + nextInt(1000)) 
    def doStuff(s: String): Unit = { 
    println(s) 
    Thread.sleep(1000 + nextInt(1000)) 
    } 
    def releaseResources(): Unit = 
    println("Releasing resources") 
} 

什麼是使通過的n打印機池支持的Stream[Task, MyPrinter]的最佳方式?當流結束時,所有的底層資源應該通過調用releaseResources來正確釋放。

獎金問題:如果打印機由於某種原因而結束,是否可以在池中創建一個新的?

回答

3

不知道,我得到了這個問題,但如何對這種

implicit val S = Strategy.fromFixedDaemonPool(10, "pooling") 

val queue = new LinkedBlockingDeque[MyPrinter]() 
queue.add(new MyPrinter) 
queue.add(new MyPrinter) 

Stream.repeatEval(Task.delay(queue.take())) 
    .map(p => try p.doStuff("test") finally { 
    p.releaseResources() 
    queue.put(p) 
    }) 
    .take(10) 
    .runLog 
    .unsafeRun() 

隊列可以https://commons.apache.org/proper/commons-pool/

UPD更換:

如果你要處理的每個 「資源」同時:

concurrent.join(10)(
    Stream 
    .repeatEval(Task.delay(queue.take())) 
    .map(p => Stream.eval(Task.delay(p.doStuff("test")) 
    .map(_ => p /* done with this resource */))) 
).map(p => { p.releaseResources(); queue.put(p) /* release resource */}) 
.take(10).runLog.unsafeRun()