Intendevi fromMaybe
anziché maybe
?
x `par` y `pseq` (fromMaybe y x)
Inoltre si sta creando una scintilla per la valutazione x
, non y
. Pertanto, fromMaybe y x
non verrà valutato fino alla valutazione di . Probabilmente volevi dire il contrario:
y `par` x `pseq` (fromMaybe y x)
Se tutto sopra è vero, allora la risposta alla tua domanda è "no", la scintilla non verrà fermato quando già iniziato (anche se verrà scartato se non ancora iniziato.) è possibile controllare con il seguente test:
import Data.Maybe
import Control.Concurrent
import Control.Parallel
import System.IO.Unsafe
import System.Mem
{-# NOINLINE x #-}
x = unsafePerformIO $ do
threadDelay 1000
return (Just 1)
{-# NOINLINE y #-}
y = unsafePerformIO $ do
print "will eval y"
threadDelay 3000000
print "did eval y"
return (2 :: Int)
main :: IO()
main = do
print $ y `par` x `pseq` fromMaybe y x
print "done"
performGC
threadDelay 4000000
l'output:
"will eval y"
1
"done"
"did eval y"
Inoltre è possibile controllare le statistiche di runtime, +RTS -s
. Contiene un numero di scintille GC'd.
Sì, hai corretto i miei errori proprio come avrebbe dovuto essere :), grazie! Quindi suppongo che per terminare i compiti devo ricorrere all'utilizzo della concorrenza e uccidere manualmente i thread con 'killThread'. –