mig*_*rao 6 haskell frp reactive-banana
触发火灾动作是否安全
(addHandler, fire) <- newAddHandler
Run Code Online (Sandbox Code Playgroud)
从一个不同的线程,编译反应香蕉图?
是的,这是安全的,但有 @Cirdec 提到的警告。
为了具体起见,请考虑以下示例,该示例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 ()
Run Code Online (Sandbox Code Playgroud)
(请参阅 Control.Concurrent 中的文档“终止程序”,了解为什么我将事件循环放在主线程中,而不是将网络放在主线程中。)
在这种情况和类似情况下,以下情况将成立:
reactimate
将在调用 的线程中运行fire
,而不是在编译网络的线程中运行。这就是@Cirdec 已经提到的。fire
,那么它可能会与其他对 的调用交错fire
,即程序可能会fire
同时调用两次。然后,
Time -> a
和列表[(Time,a)]
。reactimate
可能会交错。换句话说,纯 FRP 部分将保持纯粹,但实际 IO 仍会受到并发的影响。