我很难从电子书中理解并发性。我希望有人可以和我一起逐步进行故障排除,这样我就可以清楚地了解发生了什么。
这里是主要方法:
func main(){
c := make(chan int)
go printer(c)
wg.Add(1)
// Send 10 integers on the channel.
for i := 1; i <= 10; i++ {
c <- i
}
close(c)
wg.Wait()
}
这是打印方法:
func printer(ch chan int) {
for i := range ch {
fmt.Printf("Received %d ", i)
}
wg.Done()
}
这是我的问题:
wg.Add(1) 作为一组来等待,而不是在 main 方法中执行 wg.Add(1)循环我做了一些研究,但似乎没有人能够用简单的方式向我解释。
任何有关在 channel 上发送整数和添加到 WaitGroup 的逐步简单解释将不胜感激。
更新
源代码=> https://github.com/goinaction/code/blob/master/chapter1/channels/hellochannels.go
最佳答案
除非你故意在主线程中添加一个阻塞点,否则程序将在接收方打印最后一项之前抢占执行。
这就是 WaitGroup 完成的工作。对象和 WaitGroup.Wait()称呼。
这样您就可以告诉主线程另一个操作正在并发发生,并且您希望在结束程序执行之前等待它完成。这将通过 wg.Done() 发出信号声明。
然而,在这种情况下,这是唯一需要的,否则接收者将无法在主线程上的执行结束之前接收到最后一个项目。 但在大多数情况下, channel 也是一种同步抽象,它们决定了程序执行的流程。
但首先,WaitGroup 的原因没有被添加到循环中,是因为你的程序中只有一个你必须等待的点。单个 goroutine,由单个 channel 组成。
因为在示例中,我们使用的是 Unbuffered channel ,它一次只允许通过 channel 传输 1 条消息。
这意味着对于发送器发送的每条消息,发送器都将被阻止,直到接收器检索到该消息并将其从 channel 中删除。
当发送方发送最后一个项目时,它会关闭 channel ,向接收方表明以后不会再接收更多的消息。
range ch 发生的迭代将在收到“10”后终止,并执行 goroutine最后中断循环执行。
事情是这样的:
//发送器发送“1”
//Transmitter 现在被阻塞,因为 channel 是 unbuffered .
//接收者接收“1”
//Receiver 现在被阻塞,直到有东西被传输到 channel 。
//发射器现在已解锁,可以再次发射。
//.....
//发送器发送“10”
//接收者收到“10”
在此之后,go 函数最终可以减去 WaitGroup 上的计数器。 ,通过调用它的静态方法 Done ,并且计数器将达到零,这意味着由于 wg.Wait() 而发生的 block 操作。将抢占存在,主线程最终可以完成并终止程序执行。
要点:
channel我们正在利用它 unbuffered channel,意思是一次一条消息。另一方面,使用缓冲 channel ,您可以同时传输多个消息,然后接收方才真正决定去获取它们,WaitGroup 的优势可能会变得更加明显。<- i ,您正在向 channel 发送内容, 和 range ch你检索到这样的消息。传输的消息是固定变量类型,在本例中为整数。 关于go - 无法理解电子书中的并发示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50668002/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr