- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不确定我是否理解 purescript-coroutines 中有一个 connect
和一个 pullFrom
函数的原因。 ,以及何时使用它们。看看这些类型,它们似乎已经习惯了改变“通信方向”(我不确定这是否是正确的思考方式)。
pullFrom :: forall o m a. MonadRec m => Consumer o m a -> Producer o m a -> Process m a
connect :: forall o f m a. (MonadRec m, Parallel f m) => Producer o m a -> Consumer o m a -> Process m a
所以如果我有一个消费者和一个生产者......
consumer :: forall e a. (Show a) => Consumer a (Eff (console :: CONSOLE | e)) Unit
consumer = forever do
s <- await
lift (log $ show s)
numberProducer :: forall m. (Monad m) => Producer Int m Unit
numberProducer = go 0
where
go i = do emit i
go (i + 1)
对我来说,消费者可以从生产者那里获取数据是有意义的,如果我运行它,我可以看到显示的数字...
main = do
runProcess (pullFrom consumer numberProducer)
但是,如果我connect
生产者和消费者,它似乎什么也没做。我假设当您将生产者连接到消费者时,信号与 pullFrom
的方向相反,但我不确定这个想法是否正确。
main = do
runProcess (connect producer consumer)
最佳答案
好吧,这里面有一个有趣的小惊喜……不过我会在一分钟内谈到这一点。
pullFrom
的引入是为了让消费者在流程形成时“负责”- 只要消费者处于打开状态(等待输入),流程就会存在。
connect
只要生产者或消费者打开就运行,并且该过程仅在它们都完成时终止。
为了实现这一点,connect
有一个 Parallel
类约束,因为创建的进程同时依赖于消费者和生产者 - pullFrom
不需要这是因为该过程仅依赖于消费者
。
这就是“有趣”惊喜的来源 - 让我困惑了一分钟。 Eff
不是 Parallel
...那么您的代码如何工作?这是因为它正在为 main
推断这种类型:
main :: forall t. (Parallel t (Eff (console :: CONSOLE))) => Eff (console :: CONSOLE) Unit
所以当你的程序运行时没有任何反应,因为在 JS 中,main
期望为 Parallel
约束传递一个字典,然后是 Eff
进行评估。生成的对 main 的调用只是 Main.main();
,因此它从未实际评估 Eff
,因为它需要是 Main.main(impossibleParallelDictionary )();
.
尝试将此类型添加到您的main
:
main :: Eff (console :: CONSOLE) Unit
而且您会看到它不再进行类型检查。
尽管如此,您可以使用 Aff
,并且使用 Aff
时,connect
和 pullFrom
之间的区别是无法区分的对于这个例子:
import Prelude
import Control.Coroutine (Consumer, Producer, await, connect, emit, runProcess)
import Control.Monad.Aff (Aff, launchAff)
import Control.Monad.Aff.Console (CONSOLE, log)
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Exception (EXCEPTION)
import Control.Monad.Rec.Class (forever)
import Control.Monad.Trans.Class (lift)
consumer :: forall e a. (Show a) => Consumer a (Aff (console :: CONSOLE | e)) Unit
consumer = forever do
s <- await
lift (log $ show s)
numberProducer :: forall m. (Monad m) => Producer Int m Unit
numberProducer = go 0
where
go i = do emit i
go (i + 1)
main :: Eff (err :: EXCEPTION, console :: CONSOLE) Unit
main = void $ launchAff $ runProcess (connect numberProducer consumer)
如果我们稍微修改示例,我们可以看到差异的图示:
import Prelude
import Control.Coroutine (Consumer, Producer, await, emit, connect, runProcess)
import Control.Monad.Aff (Aff, launchAff, later')
import Control.Monad.Aff.Console (CONSOLE, log)
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Exception (EXCEPTION)
import Control.Monad.Trans.Class (lift)
consumer :: forall e a. (Show a) => Consumer a (Aff (console :: CONSOLE | e)) Unit
consumer = do
s <- await
lift (log $ show s)
numberProducer :: forall eff. Producer Int (Aff eff) Unit
numberProducer = do
emit 0
lift $ later' 10000 $ pure unit
main :: Eff (err :: EXCEPTION, console :: CONSOLE) Unit
main = void $ launchAff $ runProcess (connect numberProducer consumer)
这样,程序将打印 0,等待 10 秒,然后退出。如果您将 connect numberProducer consumer
切换为 consumer `pullFrom` numberProducer
,程序将打印 0 并立即退出。
关于coroutine - purescript-coroutines 中的 `pullFrom` 和 `connect` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42725880/
import kotlinx.coroutines.* fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")
我有一个长计算的外部库。这个库就是一切,但在过早停止方面是合作的。它被包装并在一个协程中启动。 我想从调用方终止进程。协程取消是合作的,所以它不起作用。有没有办法突然终止协程? 最佳答案 非挂起的协程
我是 Kotlin/Coroutines 的新手,我注意到两种不同的使用方式 CoroutineScope . 选项 1 如下,在任何函数中: CoroutineScope(Dispatchers.D
我对协同例程比较陌生,我正在尝试获取 Launch 协同例程将完成的行为: launch(UI) { val v1 = someDeferredType val v2 = v1.a
文档说: @asyncio.coroutine Decorator to mark generator-based coroutines. This enables the generator use
我在 kotest 中使用了 Funspec 测试风格,我得到了一个由框架自动注入(inject)的 coroutineScope,如下所示。 class MyTestSpec: FunSpec()
我想尝试从一个courtine 中暂停主线程。几个问题,但首先让我向您展示我正在使用的代码块作为测试: class MainActivity : Activity(), CoroutineScope
我不确定我是否理解 purescript-coroutines 中有一个 connect 和一个 pullFrom 函数的原因。 ,以及何时使用它们。看看这些类型,它们似乎已经习惯了改变“通信方向”(
我在不同的类(class_A、class_B)中有 2 个协程(co_A、co_B)由调度程序定期调用。在执行期间的某个时候,co_B 需要一个 co_A 在其运行期间正在计算的结果。 我想做的是这样
在 document , 如果方法也用@gen.coroutine 修饰,则不需要@web.asynchronous。像这样 @web.asynchronous @gen.coroutine def
目前在 pzmq 中有多种方法来实现文档中提到的异步 IO 循环。 http://pyzmq.readthedocs.io/en/latest/api/index.html 从纯性能的角度来看,文档中
看来我误解了当有许多套接字被打开时 Windows 如何在 TIME_WAIT 中处理套接字。如果在 TIME_WAIT 中挂出太多,它只会出错。 Linux 清理旧连接并成功(至少在我的盒子上,不确
我正在尝试对我使用 Kotlin 协程制作的 Presenter 进行单元测试,这也是我第一次使用 Mockito 每当我尝试运行单元测试时,它在协程中第一次尝试对我的 View 执行任何操作时都会收
我注意到 Boost.Coroutine2 for C++ 中删除了对对称协程的支持,所以我想了解 - 两者之间有什么区别? 最佳答案 Ana Lúcia de Moura 和 Roberto Ier
在Linux System Programming, 2nd Edition书中,协程与纤维之间的差异解释如下: 协程和纤维提供了比线程更轻的执行单元(前者是编程语言结构时的名称,后者是系统结构时的名
此示例已在另一个问题中用于说明如何使用协程来编写视频游戏中的过场动画: bob.walkto(jane) bob.lookat(jane) bob.say("How are you?") wait(2
我正在寻找实现 FSM 的方法,这导致我第一次遇到协程。 我看到了几个示例(here、here 和 here),它们暗示状态机可以由单个协程实现。然而,我注意到所有这些机器的共同点是,不包括循环,它们
我试图从ViewModel异步获取所有可启动的已安装应用程序。 这是我的ViewModel类的样子: class AppInstalledViewModel(application: Applicat
如何在kotlin中像多线程一样进行多次启动 我想让 first second 永远同时工作!! 喜欢这段代码... runBlocking { // first launch{
最近我正在按照这个 CodeLabs tutorial 学习 kotlin-coroutine 。经过一些实践后,我想知道我是否可以在 java 中编写相同的代码。所以首先我在 MyKotlinFra
我是一名优秀的程序员,十分优秀!