एक विचार: timeout
(@MathematicalOrchid ने सुझाव दिया) परिवर्तनशील चर के साथ SafeSemaphore से मध्यवर्ती मूल्यों हर बार अपनी प्रक्रिया एक आंशिक परिणाम की गणना करता है स्टोर करने के लिए संयुक्त करें:
import Control.Monad
import Control.Concurrent.MSampleVar
import System.Timeout
fac :: Integer -> Integer
fac 0 = 1
fac n = n * fac (n - 1)
tmo :: Int -> ((a -> IO()) -> IO()) -> IO (Maybe a)
tmo ms f = do
mvar <- newSV Nothing
timeout ms (f (writeSV mvar . (Just $!)))
readSV mvar
longComp :: (Integer -> IO()) -> IO()
longComp save = let loop n = save (fac n) >> loop (n + 1)
in loop 0
main :: IO()
main = tmo 10000 longComp >>= print
समारोह tmo
के लिए पारित किया अपना पहला तर्क के रूप में हो जाता है एक IO
क्रिया जो वह मध्यवर्ती परिणामों को सहेजने के लिए उपयोग कर सकती है। यदि यह समय-समय पर हो जाता है, तो अंतिम सहेजा गया परिणाम वापस कर दिया जाता है। परिणाम डब्ल्यूएचएनएफ में परिवर्तित हो जाता है ताकि वास्तविक गणना उस धागे में होती है जो नतीजे को बचाती है, न कि उस प्रक्रिया में जो tmo
से वापस आती है।
इस संस्करण में, tmo
पर फ़ंक्शन को आउटपुट को सहेजना है, यह इसे वापस नहीं कर सकता है। लेकिन इसे संशोधित करना आसान होगा ताकि यह हस्ताक्षर (a -> IO()) -> IO a
होगा।
यदि आप चीजों को और अधिक शुद्ध रखना चाहते हैं तो मैं अपना खुद का मोनड बनाने का सुझाव दूंगा जो इस विचार को IO
आउट किए बिना इस विचार को समाहित करता है।
अद्यतन: ध्यान दें कि:
कोई गारंटी नहीं कि अपवाद तुरंत हालांकि क्रम सुनिश्चित करना है कि मनमाने ढंग से देरी नहीं होती है का प्रयास करेंगे वितरित किया जाएगा, नहीं है। जीएचसी में, एक अपवाद केवल तब उठाया जा सकता है जब कोई थ्रेड सुरक्षित बिंदु तक पहुंचता है, जहां एक सुरक्षित बिंदु है जहां स्मृति आवंटन होता है। कुछ लूप लूप के अंदर कोई मेमोरी आवंटन नहीं करते हैं और इसलिए फेंकने से बाधित नहीं हो सकता है।
(throwTo के दस्तावेज़ीकरण से)। उपर्युक्त उदाहरण में, fac
कोई मेमोरी आवंटित नहीं करता है और इसलिए बड़ी संख्या में यह तुरंत बाधित नहीं होगा।
अद्यतन: मैंने उन विचारों के आधार पर एक छोटी पुस्तकालय बनाई जो गणना के लिए एक मोनाद को परिभाषित करता है जो अंतिम एक लौटने से पहले या समय-समय पर मरने से पहले आंशिक परिणाम लौटा सकता है। देखें https://github.com/ppetr/timeout-with-results
स्रोत
2012-12-01 21:55:24
[टाइमआउट] (http://www.haskell.org/hoogle/?hoogle=timeout) का उपयोग करें। अंतर्दृष्टि के लिए – leftaroundabout