我在 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(..) 导入 o​​jit_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/

10-13 06:04