【问题标题】:How to create ScalaZ Task which is running asynchronously right after creation?如何创建在创建后立即异步运行的 ScalaZ 任务?
【发布时间】:2017-03-10 04:51:13
【问题描述】:

我需要已经在运行的 Scalaz Task(或一些包装器),如果它完成了可以立即返回值,如果没有完成则等待一段时间。对于Future,我可以这样做:

val f = myTask.get.started

这样我有Future 异步运行,它在f.run 上在计算完成后调用时立即返回结果,或者阻塞一段时间并等待完成,如果不是。但是,这样我就放松了错误处理。

如何拥有Task而不使用Future,但仍然让它异步运行之前 run,或者runAsync被调用?

【问题讨论】:

    标签: scala asynchronous task scalaz


    【解决方案1】:

    scalaz.Task 的目的是明确控制执行,这使得引用透明成为可能。如果您想分叉 Task,请使用:

    val result = Task.fork(myTask)
    

    一旦您使用unsafe* 方法之一运行该任务,该任务就会在其自己的线程池中运行。

    【讨论】:

    • 谢谢,但这并不能解决我的问题。尽管如此,直到有人在上面调用run,它才会运行。我需要一个任务,当它在创建后被调用足够长的时间时,立即返回值(因为在给定的时间内它是异步计算的)。如果我没记错的话,fork 不是这种情况。
    • 它按预期工作。如果您想要在没有明确声明的情况下运行的东西,请使用Future
    猜你喜欢
    • 2014-11-20
    • 2014-12-02
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多