haskell – 在reactive-banana中,从多个线程触发处理程序操作是否安全?

触发火灾动作是否安全

(addHandler, fire) <- newAddHandler

从一个不同的线程,编译反应香蕉图?

是的,这是安全的,但@Cirdec提到了一个警告.

对于conreteness,请考虑以下示例,该示例在单独的线程中使用addHandler创建事件网络,然后在主线程中重复调用fire

import Control.Concurrent (myThreadId, threadDelay, forkIO)

main = do
    ...
    (addHandler, fire) <- newAddHandler

    let networkDescription :: MomentIO ()
        networkDescription = do
           e <- fromAddHandler addHandler
           ...
           reactimate $(print =<< myThreadId) <$e   -- reactimate

    forkIO $do
        network <- compile networkDescription
        actuate network
    ...
    forever $do                                      -- event loop
        threadDelay (10^6)
        fire ()

(请参阅文档“Terminating the program” in Control.Concurrent,了解为什么我将事件循环放在主线程中,而不是将网络放在主线程中.)

在这种情况和类似情况下,以下内容将成立:

>重新执行的IO操作将在调用fire的线程中运行,而不是在编译网络的线程中运行.这就是@Cirdec已经提到过的.
>如果还有第二个线程也在调用fire,那么它可能会与其他激活的调用交错,即程序可能同时调用两次.然后,

> Reactive-banana使用锁定来确保行为和事件一致地更新.您可以将它们视为纯函数时间 – > a和往常一样列出[(时间,a)].>但是,重新启动的IO操作可能会交错.换句话说,纯FRP部分将保持纯粹,但实际IO与往常一样是并发的.

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院