Uzun süreli çalışan bir thunk oluşturan ve bu durumun bir istisna ile sonuçlanmayan küçük programını oluşturdum. Daha sonra, birden çok konu onu değerlendirmeye çalışır. parçacığı sayısını arttırmakBir thunk bir istisna ile sonuçlanırsa, thunk sonucu tutulan istisna mıdır?
import Control.Monad
import Control.Concurrent
import Control.Concurrent.MVar
main = do
let thunk = let p = product [1..10^4]
in if p `mod` 2 == 0 then error "exception"
else()
children <- replicateM 2000 (myForkIO (print thunk))
mapM_ takeMVar children
-- | Spawn a thread and return a MVar which can be used to wait for it.
myForkIO :: IO() -> IO (MVar())
myForkIO io = do
mvar <- newEmptyMVar
forkFinally io (\_ -> putMVar mvar())
return mvar
açıkça başarısız bir thunk sonucu istisna tutar düşündürmektedir hesaplama, üzerinde herhangi bir etkisi yoktur. Bu doğru mu? Bu davranış bir yerde belgelenmiş/belirtilmiş midir?
Güncelleme:
forkFinally io (\e -> print e >> putMVar mvar())
için forkFinally
hattını değiştirme Her iş parçacığı durumla başarısız olduğunu teyit etmektedir.
Kural dışı durum * ifadenin değeridir. İfadeyi birden çok kez değerlendiren başka ne yapabilir? – Carl
@Carl Şüpheliyim, ama emin olmak istiyorum. Aynı zamanda değeri tekrar tekrar hesaplamayı da deneyebilir. –
GHC internals biliyorum, aksi takdirde ghc-heap-view' gibi araçlar oluşturamadım, bu yüzden daha fazla ihtiyacınız olandan emin değilim. Cevabım yeterli değilse, sorunuzu açıklayabilir misiniz? –