আমি খুব অদ্ভুত আচরণ দেখছি যেখানে হাস্কেলের bracketফাংশন ব্যবহৃত হয়েছে stack runবা stack testব্যবহৃত হয়েছে তার উপর নির্ভর করে আলাদা আচরণ করছে ving
নিম্নলিখিত কোডটি বিবেচনা করুন, যেখানে ডকার পাত্রে তৈরি করতে এবং পরিষ্কার করতে দুটি নেস্টেড বন্ধনী ব্যবহার করা হয়:
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) সিগিন্ট হ্যান্ডলারটি মূল থ্রেডটিকে হত্যা করে। 3) কোনও অতিরিক্ত থ্রেড উপেক্ষা করে মূল থ্রেড করলে হাস্কেল প্রোগ্রামগুলি সমাপ্ত হয়। 2 হ'ল জিএইচসি দ্বারা সংকলিত প্রোগ্রামগুলির জন্য SIGINT এ ডিফল্ট আচরণ। 3 হ্যাডকেলে থ্রেডগুলি কীভাবে কাজ করে। 1 সম্পূর্ণ অনুমান।