मैं एक बहुत ही अजीब व्यवहार देख रहा हूं, जहां हास्केल का bracket
कार्य अलग-अलग व्यवहार कर रहा है stack run
या नहीं, stack test
यह निर्भर करता है।
निम्नलिखित कोड पर विचार करें, जहां डॉक कंटेनर को बनाने और साफ करने के लिए दो नेस्टेड ब्रैकेट का उपयोग किया जाता है:
module Main where
import Control.Concurrent
import Control.Exception
import System.Process
main :: IO ()
main = do
bracket (callProcess "docker" ["run", "-d", "--name", "container1", "registry:2"])
(\() -> do
putStrLn "Outer release"
callProcess "docker" ["rm", "-f", "container1"]
putStrLn "Done with outer release"
)
(\() -> do
bracket (callProcess "docker" ["run", "-d", "--name", "container2", "registry:2"])
(\() -> do
putStrLn "Inner release"
callProcess "docker" ["rm", "-f", "container2"]
putStrLn "Done with inner release"
)
(\() -> do
putStrLn "Inside both brackets, sleeping!"
threadDelay 300000000
)
)
जब मैं इसके साथ चलता हूं stack run
और बीच में आता Ctrl+C
हूं, तो मुझे अपेक्षित आउटपुट मिलता है:
Inside both brackets, sleeping!
^CInner release
container2
Done with inner release
Outer release
container1
Done with outer release
और मैं यह सत्यापित कर सकता हूं कि दोनों डॉकटर कंटेनर बनाए जाते हैं और फिर हटा दिए जाते हैं।
हालाँकि, अगर मैं इस सटीक कोड को परीक्षण में शामिल करता हूं और चलाता हूं, तो stack test
केवल (केवल) पहला क्लीनअप होता है:
Inside both brackets, sleeping!
^CInner release
container2
यह मेरे मशीन पर चल रहे डॉकटर कंटेनर में परिणाम करता है। क्या चल रहा है?
- मैंने यह सुनिश्चित किया है कि
ghc-options
दोनों को एक ही पास किया जाए। - पूर्ण प्रदर्शन रेपो यहां: https://github.com/thomasjm/bracket-issue
.stack-work
और इसे सीधे चलाता हूं , तो समस्या नहीं होती है। यह केवल तब होता है जब नीचे चल रहा हो stack test
।
stack test
परीक्षणों को संभालने के लिए कार्यकर्ता सूत्र शुरू करता है। 2) SIGINT हैंडलर मुख्य धागे को मारता है। 3) हास्केल कार्यक्रम समाप्त होता है जब मुख्य धागा करता है, किसी भी अतिरिक्त धागे की अनदेखी करता है। 2 GHC द्वारा संकलित कार्यक्रमों के लिए SIGINT पर डिफ़ॉल्ट व्यवहार है। 3 हास्केल में धागे कैसे काम करते हैं। 1 एक पूर्ण अनुमान है।