【问题标题】:Is it safe to use trace inside a STM stransaction?在 STM 事务中使用跟踪是否安全?
【发布时间】:2015-06-01 08:51:00
【问题描述】:

我有一个事务由于某种原因无限期地失败,我想在里面使用跟踪指令。例如,在此片段中执行事务之前打印 MVar 的状态:

    data_out <- atomically $ do 
        rtg_state <- takeTMVar ready_to_go 
        JobDescr hashid url <- T.readTBChan next_job_descr
        case rtg_state of 
            Ready_RTG n -> do
                putTMVar ready_to_go $ Processing_RTG n
                putTMVar start_harvester_browser hashid
                putTMVar next_test_url_to_check_chan  hashid
                putTMVar next_harvest_url hashid
                return (n,hashid,url)
            _ -> retry

这会使程序出现段错误或行为不端吗?

【问题讨论】:

    标签: haskell stm


    【解决方案1】:

    只要您将trace 仅用于调试目的,您应该没问题。作为一般规则,只需假设在您的程序的最终生产就绪版本中不会有 traces。

    您永远不会观察到来自trace 的段错误。它的“不安全性”源于它在纯代码中注入可观察到的效果。例如,在 STM 中,当一个事务重试时,它的效果被假定为回滚。如果trace 用于向用户发送消息,则无法回滚。如果trace 的输出触发导弹发射,您将不得不处理国际副作用。如果trace 只是向开发人员发出“仅供参考,代码正在执行 X”的信号,这不是程序核心逻辑的一部分,完全可以。

    【讨论】:

    • 导弹发射代码将保存在 IO monad 中。谢谢!
    • 我发现值得指出的是,在这种情况下,造成严重国际副作用的并不是一次导弹发射——而是 735 次核齐射,交易被重试了很多次,你必须小心为了。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多