如何创建在创建后立即异步运行的 ScalaZ 任务?

Posted

技术标签:

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

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

val f = myTask.get.started

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

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

【问题讨论】:

【参考方案1】:

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

val result = Task.fork(myTask)

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

【讨论】:

谢谢,但这并不能解决我的问题。尽管如此,直到有人在上面调用run,它才会运行。我需要一个任务,当它在创建后被调用足够长的时间时,立即返回值(因为在给定的时间内它是异步计算的)。如果我没记错的话,fork 不是这种情况。 它按预期工作。如果您想要在没有明确声明的情况下运行的东西,请使用Future

以上是关于如何创建在创建后立即异步运行的 ScalaZ 任务?的主要内容,如果未能解决你的问题,请参考以下文章

创建和使用没有 sbt 的独立 scalaz jar

多任务协程怎么写

多任务协程怎么写

004_FreeRTOS创建与删除任务

如何使用 python 的 asyncio 模块正确创建和运行并发任务?

为啥我们需要异步任务以任何方式默认 Web API 请求将仅通过创建或重用现有线程来运行