Безопасно ли использовать трассировку внутри STM-транзакции?

У меня по какой-то причине транзакция завершается бесконечно, и я хотел бы использовать инструкции трассировки внутри. Например, чтобы напечатать состояние 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

Приведет ли это программу к сбою или неправильному поведению?


person dsign    schedule 01.06.2015    source источник


Ответы (1)


Пока вы используете trace только для целей отладки, все будет в порядке. Как правило, просто предположим, что в окончательной, готовой к работе версии вашей программы не будет trace.

Вы никогда не заметите segfault от trace. Его «небезопасность» связана с внедрением наблюдаемых эффектов в чистый код. Например, в STM предполагается, что когда транзакция повторяется, ее последствия откатываются. Если trace использовался для отправки сообщения пользователю, вы не можете откатить его. Если вывод trace вызывает запуск ракеты, вам придется иметь дело с международными побочными эффектами. Если trace вместо этого просто сигнализирует разработчику: «К вашему сведению, код выполняет X», это не является частью основной логики программы, и это совершенно нормально.

person chi    schedule 01.06.2015
comment
Тогда код запуска ракеты будет храниться в монаде IO. Спасибо! - person dsign; 01.06.2015
comment
Я считаю, что стоит отметить, что в данном случае не один запуск ракет дает серьезные международные побочные эффекты, а 735 ядерных залпов, когда транзакция повторялась несколько раз, и вы должны остерегаться. ;) - person kqr; 01.06.2015