gpt4 book ai didi

go - 时间.睡不醒

转载 作者:行者123 更新时间:2023-12-01 22:43:16 25 4
gpt4 key购买 nike

关闭。这个问题需要debugging details .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

1年前关闭。




Improve this question




我在工作桌面上运行了好几天的几个进程。今天早上,所有这些过程几乎都停止了工作。经过一番调试我发现在执行time.Sleep之后,执行流程就会卡在那里,永远不会醒来。因此,当我团队中的每个人都吓坏了时,我刚刚重新启动了我的 Windows 10 PC,人们认为这是一次绝望的重新启动。我想幸运的是,重启后问题就消失了。

我想知道是否有人以前经历过这种情况或知道可能是什么原因?我在另一篇文章中读到 time.Sleep基本上通过计算操作系统中的绝对时间来安排执行恢复的时间,但是AFAIK日期/时间设置从未改变。

我意识到这可能很难诊断,但我从未在非 Windows 机器上遇到过这个问题。不用说我讨厌 Windows 并且对 Unix 有偏见,但我保证如果有人能就这个 bug 给我一些合理的解释,我会给 Windows 一个机会。

最佳答案

(这不是一个答案——原因如下——而是一些提示。)

这个问题缺乏关键的背景。
桌面是否进入休眠(或休眠)并被唤醒 - 所以您希望进程从它们停止的地方继续?
您确定相关的 goroutine 卡在 time.Sleep 中吗?而不是别的东西?

最后一个问题是最有趣的,但它是无法回答的。
为此,您需要使用一些调试手段来武装您的长期运行的进程。

以粗略的方式工作但没有大惊小怪的最简单方法是以一种有趣的方式终止您的进程:发送SIGQUIT信号和 Go 运行时将使进程崩溃——将事件 goroutine 的堆栈跟踪转储到进程'stderr .
(当然,这意味着您没有在进程代码中捕获此信号。)

Windows没有信号,但是Ctrl-Break should work就像 Unix 终端中的 Ctrl-\一样,它通常发送 SIGQUIT到前台进程。

可以通过调整 GOTRACEBACK 来增强这种方法。环境变量——引用 the docs :

The GOTRACEBACK variable controls the amount of output generated when a Go program fails due to an unrecovered panic or an unexpected runtime condition. By default, a failure prints a stack trace for the current goroutine, eliding functions internal to the run-time system, and then exits with exit code 2. The failure prints stack traces for all goroutines if there is no current goroutine or the failure is internal to the run-time. GOTRACEBACK=none omits the goroutine stack traces entirely. GOTRACEBACK=single (the default) behaves as described above. GOTRACEBACK=all adds stack traces for all user-created goroutines. GOTRACEBACK=system is like “all” but adds stack frames for run-time functions and shows goroutines created internally by the run-time. GOTRACEBACK=crash is like “system” but crashes in an operating system-specific manner instead of exiting. For example, on Unix systems, the crash raises SIGABRT to trigger a core dump. For historical reasons, the GOTRACEBACK settings 0, 1, and 2 are synonyms for none, all, and system, respectively. The runtime/debug package's SetTraceback function allows increasing the amount of output at run time, but it cannot reduce the amount below that specified by the environment variable. See https://golang.org/pkg/runtime/debug/#SetTraceback.



所以,如果你用 GOTRACEBACK=crash 运行你的进程,您不仅可以收集堆栈跟踪信息,还可以收集转储文件(在当今典型的基于 Linux 的系统上,这也需要在 ulimit -c unlimited 下运行)。
不幸的是,在 Windows 上它几乎就在那里,但是 not yet ;仍然需要关注。

一个更核心的方法是让你的进程在你请求时使用自定义实现的方式转储 goroutine 堆栈 — https://golang.org/pkg/runtime/https://golang.org/pkg/runtime/debug包含执行此操作所需的所有内容。
你可以看看 https://golang.org/pkg/net/http/pprof/已实现和/或立即使用它。

关于go - 时间.睡不醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61886821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com