多线程 – 有没有办法杀死GHCi会话中的所有分叉线程而不重新启动它?

前端之家收集整理的这篇文章主要介绍了多线程 – 有没有办法杀死GHCi会话中的所有分叉线程而不重新启动它?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
基于 my previous question,我想询问是否有任何方法可以杀死GHCi会话中的所有用户创建的线程?

原因是当GHCi中的函数退出时,它产生的线程不会自动终止,即使通过代码重新加载仍然存在.重新启动GHCi解决了这个问题,但是由于我的应用程序需要一段时间才能加载,所以如果有可能(甚至是黑客)的解决方法,这将是巨大的.

解决方法

不,实际上与 How can I build a ThreadId given that I know the actual number?几乎相同的原因:图书馆根本不给你任何东西,以获得所有(仍在运行)线程或任何其他工具的线程工作在任何不属于你的线程.

此外,您无法可靠地猜测使用forkIO产生的线程属于您的GHCi会话(所有评估通常在forkIO中进行沙盒),底层的yesod应用程序或线程RTS(至少有一个对forkIO的调用),这基本上确保了所有事件管理器都关闭).目前,这并不是太糟糕了,因为GHCi运行在主线程中,如果关闭,IO管理器将重新启动,但在将来的版本中可能会发生更改.

那么为什么线程甚至在终止时收集? hs_exit().本质上,它调用ioManagerDie()(kill all event managers)和exitScheduler(..)(参见scheduler,基本上是kills all threads.这些函数都没有一个适当的FFI包装器.

调用hs_exit()时,Haskell世界的主要功能已经完成.因为这些函数中没有一个在GHC *模块中具有适当的等效项,所以不能直接在Haskell中调用它们,因此不能在GHCi中调用它们,因为没有适当的:#命令.

所以总而言之,你不能.如果要添加一个命令来重新启动GHCi中的调度程序,这将很容易.但是考虑到调度程序在hs_init()中启动并在RTS model中的hs_exit()中停止,我怀疑这将是一个容易的扩展.

根据你想做什么,你可以作弊.您可以编写自己的forkIOMem,它将ThreadId存储在全局MVar中,并替换源中的所有forkIO.这可能非常麻烦,特别是如果您正在使用图书馆,因为您需要确保将forkIO替换到任何地方.

当然,您可以使用基础包,但是这可能是疯狂的(尽管如此),更改forkIO,并将killAllforkIO添加到Control.Concurrent. (我已经说过这可能是疯狂的吧?)

原文链接:https://www.f2er.com/java/124170.html

猜你在找的Java相关文章