Golang Go语言中在终端中运行程序,滚动终端的输出时有可能导致线程卡死??
Golang Go语言中在终端中运行程序,滚动终端的输出时有可能导致线程卡死??
环境是 Windows10,go1.12
在 powershell 中运行 build 好的程序,当用鼠标滚轮滚动查看程序的输出内容时,极有可能导致进程卡住,表现为不再输出内容和网速占用降为 0kb,当按了 Ctrl+c 就恢复正常。而不滚动终端的输出时就没有发生过这种情况。
请问大伙遇到过这种情况吗?
你选中文字了吧,大概怕你白选,控制台会暂停了标准输入输出
更多关于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操作。
然而,如果你在程序中遇到了看似由终端输出滚动引起的线程卡死问题,可能有以下几种原因:
-
死锁:程序中可能存在死锁情况,即两个或多个goroutine互相等待对方释放资源,但这与终端输出滚动无直接关系。
-
资源竞争:对共享资源的访问未正确同步,可能导致某些goroutine被长时间阻塞。
-
外部系统调用:如果程序在与外部系统(如数据库、文件系统等)交互时未能正确处理超时或错误,可能会导致goroutine被阻塞。
-
I/O操作阻塞:虽然不常见,但如果使用了阻塞式的I/O操作,并且没有适当管理,可能会导致线程(在Go中表现为goroutine)无法继续执行。
解决这类问题的方法通常包括:
- 使用Go的race detector工具来检测数据竞争。
- 仔细审查代码中的同步机制,确保所有资源访问都是安全的。
- 对外部系统调用设置合理的超时和错误处理机制。
- 考虑使用非阻塞的I/O操作或异步编程模式。
总之,终端输出滚动本身不会导致Go程序中的线程卡死,但不良的并发控制或资源管理可能是问题的根源。