草庐IT

Golang 例程提前终止

coder 2024-07-12 原文

我刚开始使用 go 并编写了我的第一个程序,但输出结果不如预期。我写了一个异步例程 addUrl,它将 url 添加到 channel 5000 次,然后 consumeUrl 从 channel 中删除并打印它。 该例程仅运行 9 次。为什么?下面是代码和输出

package main

import "fmt"
import "time"

var urlCount = 0

func main(){

    urlHolder := make(chan string,5000)

    fmt.Printf("Starting program")

    go addUrls(urlHolder)

    time.Sleep(time.Millisecond * 100)
    go consumeUrls(urlHolder)

    fmt.Printf("Done")

}

func addUrls(urlHolder chan string){
    var myurl string = "https://example.com/"

    for i:=0; i<5000 ; i++ {
        urlHolder<-myurl
        fmt.Printf(" %d url added \n",i)
        time.Sleep(time.Millisecond * 10)
    }

}

func consumeUrls(urlHolder chan string) {
    urlCount++
    urlsConsumed := <- urlHolder
    fmt.Printf("Pulled url %d",urlCount," ",urlsConsumed,"\n")
    time.Sleep(time.Millisecond * 20)
}  

输出是

Starting program
 0 url added 
 1 url added 
 2 url added 
 3 url added 
 4 url added 
 5 url added 
 6 url added 
 7 url added 
 8 url added 
Done

为什么当循环为 5000 时它会在 8 点终止?

最佳答案

您正在使用 time.Sleep 等待 main 完成,但您确实应该使用 WaitGroups。

这样您就不必尝试任意选择一些时间并希望它足以让您的程序完成,或者担心设置太多时间而您的程序无所事事。

我已将 WaitGroups 的实现添加到您的代码中:

https://play.golang.org/p/1zn2JYefaA

此外,您的 consumeUrls 函数的编写方式没有正确循环,您无法打印 channel 中的所有内容。但由于这不是您的具体问题,我不会在这里解决。

关于Golang 例程提前终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40315686/

有关Golang 例程提前终止的更多相关文章

  1. ruby - 提前返回 vs if 在 ruby​​ 代码中 - 2

    我看到有两种写作风格:deffind_nest(animal)returnunlessanimal.bird?GPS.find_nest(animal.do_crazy_stuff)end对比deffind_nest(animal)ifanimal.bird?GPS.find_nest(animal.do_crazy_stuff)endend哪个更正确/更可取/遵循最佳实践?还是无所谓? 最佳答案 根据Rubystyleguide,Preferaguardclausewhenyoucanassertinvaliddata.Aguar

  2. ruby - 如何在 ruby​​ 中控制(启动/终止)后台进程(服务器应用程序) - 2

    我正在尝试通过ruby​​为集成测试(实际上是规范)设置一个服务器,但不知道如何控制该过程。所以,我要做的是:为我的gem运行一个执行集成规范的rake任务任务需要先启动服务器(我使用webrick),然后运行规范执行规范后,它应该会杀死webrick,这样我就不会留下一些未使用的后台进程webrick不是必需的,但它包含在ruby​​标准库中,因此能够使用它会很棒。希望有人能提供帮助!附言。我在linux上运行,所以让这个适用于windows的工作不是我的主要优先事项(现在)。 最佳答案 标准方法是使用系统函数fork(复制当前进

  3. ruby - 我怎样才能从 block 中提前返回一些东西? - 2

    如果我想做这样的事情:collection.eachdo|i|returnnilifi==3..manylinesofcodehere..end我怎样才能得到那种效果?我知道我可以用一个大的if语句将block内的所有内容包装起来,但我想尽可能避免嵌套。Break在这里不起作用,因为我不想想要停止剩余元素的迭代。 最佳答案 block内的next从block返回。block内的break从屈服于该block的函数返回。对于each这意味着break退出循环并且next跳转到循环的下一次迭代(因此名称)。您可以使用nextvalue和

  4. javascript - 仿函数或单子(monad)的名称和存在以链接和终止操作序列 - 2

    请原谅我,我会尽力描述我正在寻找的东西。我没有它的名字,所以它变得更加困难。查看库,例如Folktale和monet.js,我喜欢能够使用map链接操作而无需空检查或if语句,例如使用也许,要么,任务。我想知道是否存在类似的构造来解决以下问题:我有初步意见。我想构建一个对输入进行操作的函数链。每个函数可能返回也可能不返回结果。如果函数没有返回结果,则调用链中的下一个函数。一旦函数返回结果,就忽略链中的其余函数(类似于map在Maybe.Nothing上ping一个函数)返回结果。换句话说,我正在寻找类似于Maybe的东西,它包含一个值并将函数映射到Just但忽略映射到Nothing的函

  5. javascript - 如何终止 forEachObject 循环? - 2

    本题属于fabricJS和canvas。在以下情况下,检查是否有任何对象的属性为true(obj.background==true)。Canvas上可以有多个图像。在第一次对象检测之后,我想终止循环。我该怎么做?我用过returnfalse;但不起作用。这是函数。canvas.forEachObject(function(obj){if(obj.isType('image')&&obj.hasOwnProperty('background')){if(!obj.background==true){alert("true");returnfalse;}}});

  6. javascript - 在一定时间后终止 Javascript 进程 - 2

    如果这是重复的,我深表歉意。假设我有一个JavaScript函数调用网络服务来提取一些数据。我使用某种移动图形让用户知道它正在工作。成功检索后,我将图形更改为复选标记。这是我的代码:getData:function(){$("#button").attr("disabled","true");varparams={doRefresh:false,method:'/GetData',onSuccess:newthis.getDataCallback(this).callback,onFailure:newthis.getDataFailed(this).callback,args:{te

  7. javascript - Twitter 提前输入突出显示选择 - 2

    我已经实现了TwitterTypeAhead在我的页面上,它看起来很棒。但出于某种原因,当我向下箭头建议列表时,这些项目没有突出显示,但它们填充了文本框。但是,当我将鼠标悬停在建议的下拉菜单上时,这些项目会突出显示。箭头穿过时项目不会突出显示的原因是什么?如果可以,我该如何实现?myTypeahead=$('#txtBox').typeahead({name:'typeahead',valueKey:"Value",remote:'serviceHander.ashx',template:['{{Value}}'],engine:Hogan,}); 最佳答案

  8. javascript - 我可以/如何显式终止长时间运行的 xhr 请求? - 2

    这个问题在这里已经有了答案:AbortAjaxrequestsusingjQuery(18个答案)关闭9年前。我可以发起一个xhr请求来中断/终止客户端吗?我有许多长期运行的请求,一旦它们不再相关,我想放弃它们。

  9. javascript - Node JS 安装提前结束 - 2

    我注意到其他地方还有关于此的另一个问题,但它有点过时了。Hereistheissue我在下载NodeJSv4.2.4时遇到了问题它经历了安装过程,然后提示“回滚操作”。之后,它指出:“Node.JS安装向导由于错误而提前结束。”我从.msi创建了一个日志文件,但它没有提供任何有趣的东西。真的很想听取对此的反馈。我尝试取消选中在线文档,如下所述:StackAnswer但无济于事。我在Windows1064位上。 最佳答案 将“性能计数器”设置为“仅在需要时运行” 关于javascript-

  10. javascript - 为什么我的 Web Worker 终止了? - 2

    当我遇到一个非常奇怪的行为时,我正试图了解网络worker。出于某种原因,它会在几秒钟后终止,即使我有正在运行的代码。这是我的代码;主要JavaScript文件:$(document).ready(function(){varworker=newWorker("js/TestWorker.js");worker.addEventListener('message',function(event){console.log(event.data);});worker.addEventListener('error',function(event){console.log(event);})

随机推荐