В настоящее время я запускаю неизвестное количество рабочих, производящих неизвестное количество результатов, которые помещаются в MVar и печатаются, если новый результат лучше предыдущего. Это происходит в функции printMaxResult
, показанной ниже.Изящно завершайся, когда все рабочие закончены
main = do
startTime <- getCurrentTime
-- Read problem
numbers <- parseList
target <- parseTargetNumber
-- Create mvar to communicate
mvar <- newEmptyMVar
-- Start solving the actual problem
-- The solve methods will write their results
-- into the given mvar
forkIO $ SimpleAdd.solve (Problem target numbers) mvar
forkIO $ IncrementDecrement.solve (Problem target numbers) mvar incOps decOps
-- Read the first result and use it to go into the "main loop"
expr <- takeMVar mvar
debugPrintExpr expr startTime
printMaxResult mvar expr startTime
return()
-- Extracts a new result from the given mvar and compares
-- it with the previous result. If the new result has a
-- better score it remembers it and prints it.
printMaxResult :: MVar Expr -> Expr -> UTCTime -> IO()
printMaxResult mvar expr startTime = do
newExpr <- takeMVar mvar
if score newExpr > score expr
then do
debugPrintExpr newExpr startTime
printMaxResult mvar newExpr startTime
else
printMaxResult mvar expr startTime
Проблема заключается в том, что когда-то все потоки закончили сбой программы со следующим исключением: main: thread blocked indefinitely in an MVar operation
. Конечно, это сообщение верное: MVA не получит какой-либо новый вход в любое время.
Но как бы я справился с этим состоянием изящно? Мне было бы хорошо справиться с этим исключением и выполнить операцию «exit (0)». Я попытался понять, как работает обработка исключений в Haskell, но я не могу обдумать ее.
Ааа, да, это кажется вполне выполнимым и решает проблему. Думаю, я все равно буду смотреть на «трубы-параллелизм», но тонна славы для решения этой проблемы в вопросе. –