2015-06-01 4 views
8

Bir nedenden ötürü süresiz bir işlem yapıyorum ve içerideki izleme talimatlarını kullanmak istiyorum. Örneğin, bu fragmanda işlemi yürütmeden önce Mvar en durumunu yazdırmak için: Program segfault ya da özledim-davranmasını sağlayanSTM aktarımı içinde izleme kullanmak güvenli midir?

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 

istiyorsunuz?

cevap

9

Hata ayıklama amacıyla trace'u kullandığınız sürece, yalnızca Tamam olmalısınız. Genel bir kural olarak, programınızın son hazır versiyonunda trace s olacağını varsayın.

Hiçbir zaman segmantasyonları trace'dan gözlemlemezsiniz. Onun "güvensizlik", saf kodda gözlemlenebilir etkileri enjekte etmesinden kaynaklanıyor. Ör., STM’de, bir işlem tekrarlandığında, etkilerinin geri alındığı varsayılır. Kullanıcıya bir mesaj göndermek için trace kullanılmışsa, bunu geri alamazsınız. trace'un çıkışı bir füze fırlatmasını tetikliyorsa, uluslararası yan etkilerle uğraşmak zorunda kalacaksınız. Bunun yerine trace, geliştiriciyi "FYI, kod X yapıyor" ile işaretliyorsa, bu programın çekirdek mantığının bir parçası değildir ve gayet iyi.

+0

Füze fırlatma kodu IO monadında tutulur. Teşekkürler! – dsign

+4

Bu durumda ciddi uluslararası yan etkiler veren tek bir füze fırlatması olmadığını belirtmeye değer buluyorum - bu, işlemin bir kaç kez tekrarlanması gerektiğinde denenirken 735 nükleer voleybol. ;) – kqr