首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于FS2的对象池模式

基于FS2的对象池模式
EN

Stack Overflow用户
提问于 2016-07-12 17:57:30
回答 1查看 336关注 0票数 3

我想看看在FS2中实现FS2的最佳方法是什么。

假设我们有以下MyPrinter定义:

代码语言:javascript
复制
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")
}

Stream[Task, MyPrinter]打印机池制作n的最佳方法是什么?当流结束时,应该通过调用releaseResources正确地释放所有底层资源。

附加问题:如果打印机因某种原因而结束,是否可以在池中创建一个新的打印机?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-13 00:12:50

我不确定我有问题,但是这个怎么样?

代码语言:javascript
复制
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:

如果您想同时处理每个“资源”:

代码语言:javascript
复制
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()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38335931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档