我在 ghci
中测试了一些 fork 线程的函数,有点像这样:
myForkingFunction = do
tid <- forkIO (workerFunction)
putStrLn ("Worker thread: " ++ show tid)
putStrLn ("...lots of other actions...")
where workerFunction = do
putStrLn "In real life I'm listening for jobs...."
workerFunction
这导致:
🐢 > myForkingFunction
Worker thread: ThreadId 216
...lots of other actions...
🐢 > In real life I'm listening for jobs....
In real life I'm listening for jobs....
In real life I'm listening for jobs....
In real life I'm listening for jobs....
(等等)
然后当我
:r
-ing 并迭代代码时,我注意到即使我重新加载,我的 workerFunction
仍在运行。所以,我认为可以只看打印输出并执行
killThread (ThreadId 234)
或其他任何操作。但首先,我需要从
ThreadId(..)
导入 ojit_code ?然后我收到这个错误:
<interactive>:110:22: error:
• Couldn't match a lifted type with an unlifted type
When matching types
Integer :: *
GHC.Prim.ThreadId# :: TYPE 'GHC.Types.UnliftedRep
• In the first argument of ‘ThreadId’, namely ‘805’
In the first argument of ‘killThread’, namely ‘(ThreadId 805)’
In the expression: killThread (ThreadId 805)
所以我想我一定是在接近这个错误?
最佳答案
我认为没有任何方法可以构造 ThreadId
(例如,从 show
的结果中)。请参阅 this question,因此您需要保留从 ThreadId
返回的 forkIO
,例如通过将您的功能更改为:
myForkingFunction = do
tid <- forkIO (workerFunction)
putStrLn ("Worker thread: " ++ show tid)
putStrLn ("...lots of other actions...")
return tid
并在 ghci 中执行:
> tid <- myForkingFunction
> killThread tid
你得到的错误有点令人困惑,我相信与数字文字(如
216
)是多态的事实有关; ThreadId
的参数是 ThreadId#
,它是一个未提升的类型,因此在编译器甚至可以提示“没有实例 Num ThreadId#”之前,您会看到您看到的错误关于haskell - 如何手动杀死线程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52744890/