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

2023-12-25

基于我之前的问题 https://stackoverflow.com/questions/24998600/what-happens-to-child-threads-when-their-parent-dies-in-ghc-haskell/24998897我想问一下有什么办法可以全部杀掉吗用户创建GHCi 会话中的线程?

原因是,当 GHCi 中的函数退出时,它生成的线程不会自动终止,即使重新加载代码也会持续存在。重新启动 GHCi 可以解决这个问题,但由于我的应用程序需要一段时间才能加载,如果有一个可能的(甚至是 hacky 的)解决方法,那就太好了。


不,实际上出于与如果我知道实际数量,如何构建 ThreadId? https://stackoverflow.com/questions/24995262/how-can-i-build-a-threadid-given-that-i-know-the-actual-number:图书馆根本不给你任何东西来获取ThreadId所有(仍在运行的)线程或任何其他工具可以在不属于您的任何线程上工作。

此外,您无法可靠地猜测哪些线程是由forkIO属于您的 GHCi 会话(所有评估通常都在沙盒中forkIO)、底层 yesod 应用程序,或者线程化 RTS(它至少有一个对forkIO- 这基本上确保所有事件管理器都被关闭)。目前,这还不算太糟糕,因为 GHCi 运行在main如果无论如何关闭,线程和 IO 管理器都会重新启动,但这在未来的版本中可能会改变。

那么为什么线程在终止时会被收集呢?hs_exit() https://github.com/ghc/ghc/blob/c1336f71dbd80b66643e65fc7d5df0cc8fe9942b/rts/RtsStartup.c#L305-L437。本质上,它调用ioManagerDie()(杀死所有活动经理 https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/IOManager) and exitScheduler(..) (see 调度程序 https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Scheduler,这基本上杀死所有线程 https://github.com/ghc/ghc/blob/f6866824ce5cdf5359f0cad78c49d65f6d43af12/rts/Schedule.c#L2463-L2488。这些函数都没有合适的 FFI 包装器。

当时hs_exit()被称为,mainHaskell 世界已经结束了。由于这些函数中没有一个具有适当的等效项GHC.*模块,你不能直接在 Haskell 中调用它们,因此在 GHCi 中也不能直接调用它们,因为没有合适的:#命令。

所以总而言之,你不能。如果在 GHCi 中添加一个命令来重新启动调度程序,那就太简单了。但鉴于调度程序开始于hs_init()并停在hs_exit() in the 即时战略模型 https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts,我怀疑这是否是一个简单的扩展。


不过,根据您想做什么,您可以作弊。你可以自己写forkIOMem,它存储ThreadId在全球范围内MVar,并替换所有forkIO在来源中。那可以是very很麻烦,特别是如果您正在使用图书馆,因为您需要确保forkIO被替换到处.

You could, of course, meddle with the base package, but that's probably madness (still possible though), change forkIO there and add killAllforkIOs to Control.Concurrent. (I've already said that this is probably madness, right?)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 不支持 STA 线程上多个句柄的 WaitAll

    为什么我会收到此错误消息 不支持 STA 线程上多个句柄的 WaitAll 我应该使用 STAThreadAttribute 属性吗 Update 不适用于 WPF 应用程序 笔记 错误位于 WaitHandle WaitAll doneE
  • std::map 只读操作的线程安全

    我有一个 std map 用于将值 字段 ID 映射到人类可读的字符串 当我的程序在任何其他线程启动之前启动时 该映射会被初始化一次 之后就不会再被修改 现在 我为每个线程提供了这个 相当大的 映射的自己的副本 但这显然是内存使用效率低下
  • 将两个 Int 值相除以获得 Float 的正确方法是什么?

    我想分两份IntHaskell 中的值并获得结果Float 我尝试这样做 foo Int gt Int gt Float foo a b fromRational a b 但 GHC 版本 6 12 1 告诉我 无法将预期类型 Intege
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • 为什么在谈论线程和进程时,“不要同时格式化软盘”的评论很有趣?

    我正在阅读之间的区别线程和进程 https stackoverflow com questions 200469 what is the difference between a process and a thread并在第二个答案中发现
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 在 Three.js 中从 Web Worker 加载纹理

    当将大纹理图像应用到网格上一段明显的时间时 Three js 会锁定浏览器的主线程 让我们考虑以下示例 var texLoader new THREE TextureLoader texLoader load someLargeTextur
  • 理解 JavaScript 的单线程本质

    我一直在阅读 John Resig 的 JavaScript Ninja 的秘密 它解释了 JavaScript 是单线程的 但是 我尝试对此进行测试 但我不确定要从这里删除什么 executing this in browser func
  • 在 Yesod 生态系统中,对某些文本进行 urlencode 的最佳方式是什么?

    我想对一些文本进行 url 编码 例如 用 20 替换每个空格等 我找到了 HTTP Network HTTP Base urlEncode 并且可以使用它 但我想知道是否还有其他通常在 Yesod 生态系统中使用的东西 不幸的是 由于 U
  • 如何限制Erlang VM(BEAM)使用的核心数量?

    我正在具有 2 个四核 Xeon E5520 2 2GHz 24 0GB RAM 和 Erlang R15B02 启用 SMP 的节点上运行实验 我想知道是否可以限制Erlang VM使用的核心数量 以便我可以暂时禁用一些核心并逐步增加数量
  • 张量流和线程

    下面是来自 Tensorflow 网站的简单 mnist 教程 即单层 softmax 我尝试通过多线程训练步骤对其进行扩展 from tensorflow examples tutorials mnist import input dat
  • Android 为什么这不会抛出错误的线程异常?

    我的印象是视图只能从主线程操作 但是 为什么这不会崩溃 public class MainActivity extends Activity TextView tv Override protected void onCreate Bund
  • 终结器线程的范围是什么 - 每个应用程序域或每个进程?

    根据我的所有阅读 应该有一个 GC 线程来调用所有终结器 现在的问题是这个 一个 线程的范围是什么 每个进程或每个应用程序域 因为域的整体目的是在一个进程空间中分离并创建 独立 的不同应用程序 I read here http dn cod
  • Haskell / GHC - 是否有“警告不完整模式”的中缀标签/编译指示

    我正在寻找一个可以对特定的不完整模式发出警告的编译指示 它会使编译器失败并显示以下 假设的 代码 FAILIF incomplete patterns f Int gt Int f 0 0 我正在尝试使用 Arrows 编写一个 编译器 并
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • 调用许多网络服务的最佳方式?

    我有 30 家子公司 每家都实施了他们的 Web 服务 使用不同的技术 我需要实现一个Web服务来聚合它们 例如 所有子公司的Web服务都有一个名为的Web方法GetUserPoint int nationalCode 我需要实现我的网络服
  • 这个等待通知线程语义的真正目的是什么?

    我刚刚遇到一些代码 它使用等待通知构造通过其其他成员方法与类中定义的线程进行通信 有趣的是 获取锁后 同步范围内的所有线程都会在同一锁上进行定时等待 请参见下面的代码片段 随后 在非同步作用域中 线程执行其关键函数 即 做一些有用的事情1
  • Erlang 如何睡觉(晚上?)

    我想在 Erlang 服务器上每隔几个小时运行一次小型清理过程 我知道计时器模块 我在教程中看到一个示例 使用链式计时器 睡眠命令来等待几天后发生的事件 我觉得这很奇怪 我知道 Erlang 进程与其他语言中的进程相比是独一无二的 但是进程

随机推荐