草庐IT

go - 主线程永远不会屈服于 goroutine

coder 2023-06-28 原文

  • 编辑 * -- 取消注释这两个运行时行并将 Tick() 更改为 Sleep() 并且它按预期工作,每秒打印一个数字。保持代码不变,以便回答/评论有意义。

go版本go1.4.2 darwin/amd64

当我运行以下命令时,我从未看到 go Counter() 打印出任何内容。

package main

import (
  "fmt"
  "time"
  //"runtime"
)

var count int64 = 0

func main() {
  //runtime.GOMAXPROCS(2)
  fmt.Println("main")
  go Counter()
  fmt.Println("after Counter()")
  for {
    count++
  }
}

func Counter() {
  fmt.Println("In Counter()")
  for {
    fmt.Println(count)
    time.Tick(time.Second)
  }
}

> go run a.go
main
after Counter()

如果我取消对运行时内容的注释,我会得到一些奇怪的结果,例如以下所有内容同时打印(不是一秒钟):

> go run a.go
main
after Counter()
In Counter()
10062
36380
37351
38036
38643
39285
39859
40395
40904
43114

我期望的是 go Counter() 将在主线程连续递增时每秒打印任何计数。我并不是在寻找不同的代码来完成同样的事情。我的问题更多是关于发生了什么以及我的期望哪里错了?特别是第二个结果没有任何意义,一次打印出来。据我所知,它们的打印间隔绝不能少于一秒,对吗?

最佳答案

在紧密的 for 循环中没有任何东西可以让 Go 调度程序运行。 每当一个阻塞或某些(哪个?所有?)函数调用时,调度都会考虑其他 goroutine。

既然你不这样做,最简单的解决方案是添加对 runtime.Gosched 的调用.例如:

for {
    count++
    if count % someNum == 0 {
        runtime.Gosched()
    }
}

另请注意,在没有锁定或同步的情况下从不同的 goroutine 写入和读取相同的变量是一种数据竞争,并且 there are no benign data races ,您的程序可以在读取正在写入的值时做任何。 (并且同步也会让 Go 调度程序运行。)

对于一个简单的计数器,您可以使用 atomic.AddInt64(&var, 1) 来避免锁定和 atomic.LoadInt64(&var) .

进一步注意(正如@tomasz 所指出的,我完全错过了),time.Tick 不会延迟任何事情,您可能想要 time.Sleepfor range time.Tick(…).

关于go - 主线程永远不会屈服于 goroutine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30381558/

有关go - 主线程永远不会屈服于 goroutine的更多相关文章

  1. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  2. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  3. ruby - 通过 RVM 安装 Ruby 1.9.2 永远行不通! - 2

    当我执行>rvminstall1.9.2时一切顺利。然后我做>rvmuse1.9.2也很顺利。但是当涉及到ruby​​-v时..sam@sjones:~$rvminstall1.9.2/home/sam/.rvm/rubies/ruby-1.9.2-p136,thismaytakeawhiledependingonyourcpu(s)...ruby-1.9.2-p136-#fetchingruby-1.9.2-p136-#downloadingruby-1.9.2-p136,thismaytakeawhiledependingonyourconnection...%Total%Rece

  4. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  5. ruby-on-rails - prawnto 显示新页面时不会中断的表格 - 2

    我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.

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

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

  7. ruby-on-rails - 使用 ApplicationController.renderer.render 从 Controller 外部渲染的 Rails 5 不会在自身上设置变量 - 2

    我正在使用Rails5ApplicationController.renderer.render方法从模型中进行渲染。我需要将一些变量传递给我的布局,这是我使用locals选项完成的;如果直接访问此变量,则该变量在布局中可用,但不能通过self访问。这是我设置渲染的方式html_string=ApplicationController.renderer.render(file:"/#{template_path}/base/show",:formats=>[:pdf,:html],locals:{:@routing_form=>self,:controller_name=>contro

  8. ruby - apt Recipe 不会安装在我的 Recipe 中 - 2

    我正在尝试使用Vagrant创建我的第一个ChefRecipe,但在第一步就遇到了问题。我的Recipe的第一行是:include_recipe"apt"但是当我尝试vagrantprovision时,出现以下错误:==>default:[2014-09-21T07:15:42+00:00]WARN:MissingCookbookDependency:==>default:Recipe`apt`isnotintherun_list,andcookbook'apt'==>default:isnotadependencyofanycookbookintherun_list.Toloadth

  9. ruby - Rails 3 不会用 rvm 安装 sqlite3-ruby gem? - 2

    我正在试用rvm,并用它安装了ruby​​1.9.2和rails3。我需要重新安装sqlite3-rubygem(因为rvm为不同版本的ruby​​将所有gem分开)。问题是,当我尝试时,我得到:geminstallsqlite3-ruby/home/jenny/.rvm/rubies/ruby-1.9.2-p0/bin/gem:4:warning:Insecureworldwritabledir/home/jenny/.rvm/gems/ruby-1.9.2-p0/bininPATH,mode040777Buildingnativeextensions.Thiscouldtakeaw

  10. ruby - 为什么包含此模块不会覆盖动态生成的方法? - 2

    我正在尝试通过包含一个模块来覆盖动态生成的方法。在下面的示例中,Ripple关联将rows=方法添加到Table。我想调用那个方法,但之后还要做一些额外的事情。我创建了一个模块来覆盖该方法,认为该模块的row=将能够调用super以使用现有方法。classTable#Rippleassociation-createsrows=methodmany:rows,:class_name=>Table::Row#Hackyfirstattempttousethedynamically-created#methodandalsodoadditionalstuff-Iwouldactually#m

随机推荐