jjzjj

go - fmt.Print in go routine *may* not output when master thread is loop

coder 2023-06-30 原文

以下代码与 https://play.golang.org/p/X1-jZ2JcbOQ 中的一样

package main
import (
        "fmt"
)
func p(s string) {
        fmt.Println(s)
}

func main() {
    go fmt.Println("1")
    go p("2")
    for {}   // infinite loop
}

在使用 golang 1.11 的 Windows 中肯定打印 1 2 但在使用 golang 1.11.4 的 Linux 中绝对不打印任何内容。我能理解前者的行为,但不能理解后者。为什么go程序一直不运行非master线程?

这背后有什么原因吗?

最佳答案

Go Playground 以 GOMAXPROCS=1 运行。在 Playground 上试试这个:

package main

import (
  "fmt"
  "runtime"
)

func main() {
  fmt.Println(runtime.GOMAXPROCS(0))
}

当你在本地运行时,你可能会有更高的 GOMAXPROCS 值。

即使在 playground 上,如果你通过引入 Sleep [ https://play.golang.org/p/QquMPZSd6kI] 取消调度主 goroutine,你也可以看到打印工作:

func main() {
    go fmt.Println("1")
    go p("2")

    time.Sleep(time.Second)
    for {}
 }

在开始时更改 GOMAXPROCS:

    runtime.GOMAXPROCS(2)

关于go - fmt.Print in go routine *may* not output when master thread is loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54702972/

有关go - fmt.Print in go routine *may* not output when master thread is loop的更多相关文章

  1. ruby-on-rails - Textmate 'Go to symbol' 相当于 Vim - 2

    在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol

  2. ruby - Textmate 错误重复行 "ruby: warning: -K is specified; it is for 1.8 compatibility and may cause odd behavior" - 2

    在Textmate中使用ctrl+shift+d快捷方式重复行时,出现以下错误:“ruby:警告:指定了-K;这是为了1.8兼容性,可能会导致奇怪的行为” 最佳答案 此问题不仅限于重复行,还可能出现在其他使用ruby​​的地方。我通过将Preferences...>Advanced>ShellVariables中的PATH更改为/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin来解决它:/usr/bin:/bin:/usr/sbin:/sbin此更改后,Tex

  3. ruby-on-rails - 为什么 ruby​​-debug 说 'Saved frames may be incomplete' - 2

    我有时会在触发断点时收到此消息。看起来堆栈帧没有得到保存,所以我无法通过调用堆栈返回-真的很痛苦。看下面的例子-->#0BatchProcess.add_failure_record(row_id#Fixnum,test#Struct::Test,message#String,...)atlineserver/processes/batch.rb:309Warning:savedframesmaybeincomplete;comparewithcaller(0).(rdb:1)ppcaller["./server/processes/batch.rb:309:in`run_tests'

  4. ruby-on-rails - 用于 Ruby 的 vim 中的全局 "Go to definition"? - 2

    自97年以来我一直在使用vi/vim进行各种快速编辑和管理任务,但最近才考虑使用它来替换Netbeans作为我选择的ruby​​编辑器。我发现一件事在Netbeans和Eclipse中非常有用的是Ctrl+Click“转到定义”功能,您可以在其中按住Ctrl键并单击一个类或方法,然后它将带您了解定义。现在,我玩过丰富的ctags和rails.vim,而且很接近,但没有雪茄。这就是我想要的:默认情况下在Netbeans和Eclipse中,您可以在本地rails中按住ctrl并单击本地方法或类项目,但你也可以ctrl+click定义在gems或用Ruby编写的系统库。以Netbeans为例

  5. ruby-on-rails - Rails 上的 ruby : How to have multiple submit buttons going to different methods (maybe with with_action? ) - 2

    这个问题在这里已经有了答案:HowdoIcreatemultiplesubmitbuttonsforthesameforminRails?(7个答案)关闭9年前。所以..'save'%>'library'%>然后在我的Controller中:with_actiondo|a|a.savedoenda.librarydoendend问题是只有一个操作被调用...两个submit_tags调用相同的操作...知道为什么吗?或者我如何获得两个按钮以将表单提交给两种不同的方法?

  6. ruby - 法拉第 : you may want to install system_timer for reliable timeouts - 2

    我将一个旧脚本迁移到一个新的CentOSbox并在运行脚本时收到以下消息:Faraday:youmaywanttoinstallsystem_timerforreliabletimeouts它是警告吗?system_timer是什么?gem? 最佳答案 这是一颗gem。不过,您应该不再需要它了,因为它只支持Ruby1.8及更早版本(Ruby1.8已正式弃用)。来自http://ph7spot.com/musings/system-timer:Update:system_timerisonlyrelevantifyouarerunni

  7. DiFi: A Go-as-You-Pay Wi-Fi Access System 精读笔记(三) - 2

    IV.SYSTEMIMPLEMENTATIONWeadoptmodulardesignfollowingtheintegrationofblockchain.Itbringsmoreflexibilitybyseparatingtheimplementationofdifferentfunctionalities,sowecouldleveragetheadvantagesoftheblockchain-basedsmartcontractwhilereducingoverhead.Figure3illustrateshowdifferentmodulesareinvolvedintheint

  8. go-templates - 如何根据表达式有条件地在 Go 模板中设置变量,如果不使用 if 语句包装可能会导致错误 - 2

    问题我该如何做这样的事情:{{$use_ssl:=(ne$.Env.CERT_NAME"")}}其中$.Env.CERT_NAME可能为零/未定义。如果它是零,它给出这个错误:at:errorcallingne:invalidtypeforcomparison注意:我无法控制传递给Go模板的对象,因此必须完全在模板本身内解决这个问题。我尝试过的我试图通过首先检查它是否为非空来变通:{{$use_ssl:=(($.Env.CERT_NAME)&&(ne$.Env.CERT_NAME""))}}但它给出了这个错误:unexpected"&"inoperand所以我切换到这个,这在语法上是允

  9. Go time与string的相爱相杀 - 2

    time包与string包可以说是在Go语言的开发中常用的两个包实际开发过程中(例如web开发)经常会遇到time类型与string类型的交互,计算比较等场景首先来了解GO语言里非常浪漫的一个点,即2006-01-0215:04:05,GO语言诞生的时间,通常用来做时间的格式化time转stringt:=time.Now()//当前时间timeLayoutStr:="2006-01-0215:04:05"t.Format(timeLayoutStr)//返回值为string,可以用一个值来接收它上述例子中,将time类型t转换为string类型,并格式化为年-月-日时-分-秒,这里的格式化是可

  10. ruby-on-rails - rails : Finding max of array that may contain nil - 2

    给定:shipping_costs={key1:45,key2:99,key3:nil,key4:24}假设nil=0,获取这些键的最大值的最简洁方法是什么?如果我在Rails控制台中直接运行shipping_costs.values.max,我会得到:ArgumentError:comparisonofFixnumwithnilfailed在运行max之前将这些nils变成零的最干净的方法? 最佳答案 如果你想让它非常简洁,你可以使用shipping_costs.values.compact.maxcompact方法从数组中删除所

随机推荐