Golang Go语言中在终端中运行程序,滚动终端的输出时有可能导致线程卡死??

发布于 1周前 作者 vueper 来自 Go语言

Golang Go语言中在终端中运行程序,滚动终端的输出时有可能导致线程卡死??

环境是 Windows10,go1.12

在 powershell 中运行 build 好的程序,当用鼠标滚轮滚动查看程序的输出内容时,极有可能导致进程卡住,表现为不再输出内容和网速占用降为 0kb,当按了 Ctrl+c 就恢复正常。而不滚动终端的输出时就没有发生过这种情况。

请问大伙遇到过这种情况吗?

11 回复

你选中文字了吧,大概怕你白选,控制台会暂停了标准输入输出

更多关于Golang Go语言中在终端中运行程序,滚动终端的输出时有可能导致线程卡死??的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


只要是控制台程序都会这样吧,当滚动终端的时候会阻塞标准输入输出,如果没有在独立线程中 print 的就会卡住当前执行 print 的线程



明白了,谢谢

是这样的…你还可能会碰到一个疑似 bug 的情况:控制台最小化之后,过段时间程序也卡住了

关闭 powershell 的快速编辑模式。

封装一个自己的 log 或者什么的,不直接 print 到 stdout 或 stderr,而是先写到一个 buffer 中,然后用一个 goroutine 负责从 buffer 读取内容 print,这样可能阻塞的 print 只会发生在这个 goroutine,调用 log 的时候不会发生阻塞

正常的,敲一下回车键就正常了





谢谢大伙,原来如此,以前没注意过这种问题。

哇,学习到了~~~

可以用 windows terminal,可以避免这个问题

在Golang(Go语言)中,正常情况下,在终端中运行程序并不会因为滚动终端输出而导致线程卡死。Go语言运行时环境和标准库设计得相当健壮,以处理常见的并发和I/O操作。

然而,如果你在程序中遇到了看似由终端输出滚动引起的线程卡死问题,可能有以下几种原因:

  1. 死锁:程序中可能存在死锁情况,即两个或多个goroutine互相等待对方释放资源,但这与终端输出滚动无直接关系。

  2. 资源竞争:对共享资源的访问未正确同步,可能导致某些goroutine被长时间阻塞。

  3. 外部系统调用:如果程序在与外部系统(如数据库、文件系统等)交互时未能正确处理超时或错误,可能会导致goroutine被阻塞。

  4. I/O操作阻塞:虽然不常见,但如果使用了阻塞式的I/O操作,并且没有适当管理,可能会导致线程(在Go中表现为goroutine)无法继续执行。

解决这类问题的方法通常包括:

  • 使用Go的race detector工具来检测数据竞争。
  • 仔细审查代码中的同步机制,确保所有资源访问都是安全的。
  • 对外部系统调用设置合理的超时和错误处理机制。
  • 考虑使用非阻塞的I/O操作或异步编程模式。

总之,终端输出滚动本身不会导致Go程序中的线程卡死,但不良的并发控制或资源管理可能是问题的根源。

回到顶部