jjzjj

go - 与 defer wg.Done 和 channel 混淆

coder 2024-07-13 原文

我在使用 defer wg.Done 和 channel 时遇到问题。

如果我像下面这样编码,就没有问题。

for i := 0; i < ntasks; i++ {
    wg.Add(1)
    go func(args DoTaskArgs) {
        // defer wg.Done()
        for {
            worker := <-registerChan
            ok := call(worker, "Worker.DoTask", &args, nil)
            if ok {
                wg.Done()
                // go func() {
                registerChan <- worker
                // }()
                break
            }
        }
    }(DoTaskArgs{jobName, mapFiles[i], phase, i, n_other})
}
wg.Wait()

但如果我使用 defer wg.Done() ,代码将被卡住,除非包装 registerChan <- workergo func .

for i := 0; i < ntasks; i++ {
    wg.Add(1)
    go func(args DoTaskArgs) {
        defer wg.Done()
        for {
            worker := <-registerChan
            ok := call(worker, "Worker.DoTask", &args, nil)
            if ok {
                // go func() {
                registerChan <- worker
                // }()
                break
            }
        }
    }(DoTaskArgs{jobName, mapFiles[i], phase, i, n_other})
}
wg.Wait()

这里有什么问题?

最佳答案

好吧,首先,您的 channel 使用困惑并且会阻塞。在 goroutine 中,它从 channel 中读取。但没有写入任何内容。

我不认为你的问题与延迟有任何关系。

关于go - 与 defer wg.Done 和 channel 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49227513/

有关go - 与 defer wg.Done 和 channel 混淆的更多相关文章

  1. ruby - 关于 Ruby 中 Dir[] 和 File.join() 的混淆 - 2

    我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案

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

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

  3. ruby - RVM Gemsets 和 Ruby Gemfile 混淆 - 2

    请有人帮助我了解ruby​​应用程序如何管理应用程序的gemfile和rvmgemsets。如果我当前使用的是Gemset,安装了一堆gem,并且我的gemfile中也有gems,那么Ruby应用程序是使用gemfile中的gem还是应用程序的gemset中的gem? 最佳答案 要理解这一点,您需要退后一步,了解ruby​​gems的一般工作原理。让我们从一个没有rvm或Gemfile的系统开始。当您通过“geminstall”安装gem时,它会进入系统gem位置。每当您编写ruby​​脚本并需要gem时,它就会从那里获取。现在假设

  4. Ruby - 数组方法混淆 - 2

    我们可以像这样在顶层调用Array方法Array(something)这对我来说很有意义,它是一个没有显式接收者的方法调用,并且在本例中是main的self被插入到方法调用的前面。但这不是等同于:Kernel.Array(something)这对我来说没有意义。由于在第一种情况下,对象main属于Object类,其中混入了Kernel模块,因此具有Array方法。但是在第二种情况下,我们在内核模块对象本身而不是主对象上调用Array方法,它们不是一回事吗?抱歉我的英语不好。 最佳答案 Kernel.Array是所谓的模块函数。模块函

  5. 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为例

  6. ruby - 与 Ruby 的 <=> 运算符混淆 - 2

    我对Ruby的运算符感到困惑。它与==或===有何不同?任何综合示例/用例?谢谢。 最佳答案 是组合比较运算符。如果LHS等于RHS,则返回0;如果LHS大于RHS,则返回1;如果LHS小于RHS,则返回-1 关于ruby-与Ruby的运算符混淆,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4746129/

  7. Ruby 代码混淆 - 2

    这个问题在这里已经有了答案:Rubyobfuscator[duplicate](3个答案)关闭9年前。我必须混淆ruby​​代码以隐藏敏感源。我需要朝着正确的方向前进才能实现我想要的,所以:是否有Python的pyc的Ruby替代品?,我在许多gem中看到了version.rbc文件。它是如何产生的?此过程是否适用于其他(复杂的,而不仅仅是简单的版本声明)类型的Ruby文件?RubyEncoder可以完成这项工作(可以吗?帮我解决这个问题),但它需要购买许可证。这就是为什么我会将其视为最后的手段。任何其他建议

  8. Ruby 的 String#hex 混淆 - 2

    我发现Ruby中的String#hex没有为给定的字符返回正确的十六进制值很奇怪。我可能误解了这个方法,但举个例子:'a'.hex=>10而“a”的正确十六进制值是61:'a'.unpack('H*')=>61我错过了什么吗?什么是十六进制?任何提示表示赞赏!谢谢 最佳答案 String#hex不会为您提供字符的ASCII索引,它用于将base-16数字(hexadecimal)从字符串转换为整数:%riString\#hexString#hex(fromrubysite)------------------------------

  9. ruby-on-rails - Ruby on Rails 源代码安全/混淆 - 2

    这个问题在这里已经有了答案:EncodingRubyonRailscode?(5个答案)关闭3年前。我刚刚开始使用RubyonRails开发,我有一个关于源代码“隐私”的问题。据我所知(我还没有做过部署,只是在本地开发环境中使用了RoR),当部署RoR应用程序时,所有源代码都是“可见的”"在服务器上?我怎样才能保护我的代码;可以这么说?我所说的保护是指,主要目的是某人(例如RoR提供商的服务器管理员)无法通过轻松找出代码中“摆弄”的位置来“破坏”代码与”。Shopify、Yellowpages等使用RoR的网站如何确保其代码未被“破坏”?更新我真正要寻找的是,假设如果我有一些进行信用卡

  10. ruby-on-rails - Devise 和 ActionMailer 混淆 - 2

    我正在使用Devise进行身份验证,但我对如何使用它设置邮件感到困惑。您仍然应该创建自己的邮件程序和初始化程序文件,还是应该通过Devise发送所有邮件?您在Devise中的什么位置创建电子邮件模板和发送电子邮件的方法?我意识到这是一个宽泛的问题,所以基本上我想问的是使用Devise设置邮件的最佳方式是什么?此外,如果您想在用户确认电子邮件后向他们发送电子邮件,您会怎么做? 最佳答案 Devise确实创建了自己的Mailer——如果您在GitHub上查看https://github.com/plataformatec/devise/

随机推荐