sync.WaitGroup doesnt waits












-2















May be I can not see obvious thing, what am I doing wrong:



func printSize (listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
go func(){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}()
}
wg.Wait()
}


If I remove wg and go, I receive the size of each url body correctly. If I do it as in above, it prints zeroes almost instantly. The getUrlBody() takes time to execute sometimes minutes.



Answering comment: I also tried it this way, to be sure, and it demonstrate same behaviour.
I found the error was in getUrlBody and main() function...



func printSize(listOfUrls string) {
var wg sync.WaitGroup
wg.Add(len(listOfUrls))
for _, myurl := range listOfUrls {
go f(myurl, &wg)
}
wg.Wait()
}

func f(myurl string, wg *sync.WaitGroup) {
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}









share|improve this question




















  • 2





    You have a racecondition in your code on myurl. You should copy it by passing it to the closure. Otherwise, it will probably mostly refer to the last element in your range in all of your goroutines.

    – inf
    Jun 1 '15 at 17:43













  • Yes, I added 2nd version which I guess correct, but does not works too.

    – MikeKlemin
    Jun 1 '15 at 17:57











  • What happens when you run the second version?

    – ThunderCat
    Jun 1 '15 at 17:59











  • If listOfUrls has say 4 urls, It prints ("Getting url:") from getBodyUrls four times, and then it prints zeroes for length also four times... In theory it should print "Done url: " from getBodyUrls, and print correct size...

    – MikeKlemin
    Jun 1 '15 at 18:02













  • It's not possible to comment on what's going on because none of the print statements mentioned in your comment are in the code that you have shown.

    – ThunderCat
    Jun 1 '15 at 18:08
















-2















May be I can not see obvious thing, what am I doing wrong:



func printSize (listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
go func(){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}()
}
wg.Wait()
}


If I remove wg and go, I receive the size of each url body correctly. If I do it as in above, it prints zeroes almost instantly. The getUrlBody() takes time to execute sometimes minutes.



Answering comment: I also tried it this way, to be sure, and it demonstrate same behaviour.
I found the error was in getUrlBody and main() function...



func printSize(listOfUrls string) {
var wg sync.WaitGroup
wg.Add(len(listOfUrls))
for _, myurl := range listOfUrls {
go f(myurl, &wg)
}
wg.Wait()
}

func f(myurl string, wg *sync.WaitGroup) {
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}









share|improve this question




















  • 2





    You have a racecondition in your code on myurl. You should copy it by passing it to the closure. Otherwise, it will probably mostly refer to the last element in your range in all of your goroutines.

    – inf
    Jun 1 '15 at 17:43













  • Yes, I added 2nd version which I guess correct, but does not works too.

    – MikeKlemin
    Jun 1 '15 at 17:57











  • What happens when you run the second version?

    – ThunderCat
    Jun 1 '15 at 17:59











  • If listOfUrls has say 4 urls, It prints ("Getting url:") from getBodyUrls four times, and then it prints zeroes for length also four times... In theory it should print "Done url: " from getBodyUrls, and print correct size...

    – MikeKlemin
    Jun 1 '15 at 18:02













  • It's not possible to comment on what's going on because none of the print statements mentioned in your comment are in the code that you have shown.

    – ThunderCat
    Jun 1 '15 at 18:08














-2












-2








-2








May be I can not see obvious thing, what am I doing wrong:



func printSize (listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
go func(){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}()
}
wg.Wait()
}


If I remove wg and go, I receive the size of each url body correctly. If I do it as in above, it prints zeroes almost instantly. The getUrlBody() takes time to execute sometimes minutes.



Answering comment: I also tried it this way, to be sure, and it demonstrate same behaviour.
I found the error was in getUrlBody and main() function...



func printSize(listOfUrls string) {
var wg sync.WaitGroup
wg.Add(len(listOfUrls))
for _, myurl := range listOfUrls {
go f(myurl, &wg)
}
wg.Wait()
}

func f(myurl string, wg *sync.WaitGroup) {
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}









share|improve this question
















May be I can not see obvious thing, what am I doing wrong:



func printSize (listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
go func(){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}()
}
wg.Wait()
}


If I remove wg and go, I receive the size of each url body correctly. If I do it as in above, it prints zeroes almost instantly. The getUrlBody() takes time to execute sometimes minutes.



Answering comment: I also tried it this way, to be sure, and it demonstrate same behaviour.
I found the error was in getUrlBody and main() function...



func printSize(listOfUrls string) {
var wg sync.WaitGroup
wg.Add(len(listOfUrls))
for _, myurl := range listOfUrls {
go f(myurl, &wg)
}
wg.Wait()
}

func f(myurl string, wg *sync.WaitGroup) {
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}






concurrency go






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jun 1 '15 at 18:49







MikeKlemin

















asked Jun 1 '15 at 17:39









MikeKleminMikeKlemin

372416




372416








  • 2





    You have a racecondition in your code on myurl. You should copy it by passing it to the closure. Otherwise, it will probably mostly refer to the last element in your range in all of your goroutines.

    – inf
    Jun 1 '15 at 17:43













  • Yes, I added 2nd version which I guess correct, but does not works too.

    – MikeKlemin
    Jun 1 '15 at 17:57











  • What happens when you run the second version?

    – ThunderCat
    Jun 1 '15 at 17:59











  • If listOfUrls has say 4 urls, It prints ("Getting url:") from getBodyUrls four times, and then it prints zeroes for length also four times... In theory it should print "Done url: " from getBodyUrls, and print correct size...

    – MikeKlemin
    Jun 1 '15 at 18:02













  • It's not possible to comment on what's going on because none of the print statements mentioned in your comment are in the code that you have shown.

    – ThunderCat
    Jun 1 '15 at 18:08














  • 2





    You have a racecondition in your code on myurl. You should copy it by passing it to the closure. Otherwise, it will probably mostly refer to the last element in your range in all of your goroutines.

    – inf
    Jun 1 '15 at 17:43













  • Yes, I added 2nd version which I guess correct, but does not works too.

    – MikeKlemin
    Jun 1 '15 at 17:57











  • What happens when you run the second version?

    – ThunderCat
    Jun 1 '15 at 17:59











  • If listOfUrls has say 4 urls, It prints ("Getting url:") from getBodyUrls four times, and then it prints zeroes for length also four times... In theory it should print "Done url: " from getBodyUrls, and print correct size...

    – MikeKlemin
    Jun 1 '15 at 18:02













  • It's not possible to comment on what's going on because none of the print statements mentioned in your comment are in the code that you have shown.

    – ThunderCat
    Jun 1 '15 at 18:08








2




2





You have a racecondition in your code on myurl. You should copy it by passing it to the closure. Otherwise, it will probably mostly refer to the last element in your range in all of your goroutines.

– inf
Jun 1 '15 at 17:43







You have a racecondition in your code on myurl. You should copy it by passing it to the closure. Otherwise, it will probably mostly refer to the last element in your range in all of your goroutines.

– inf
Jun 1 '15 at 17:43















Yes, I added 2nd version which I guess correct, but does not works too.

– MikeKlemin
Jun 1 '15 at 17:57





Yes, I added 2nd version which I guess correct, but does not works too.

– MikeKlemin
Jun 1 '15 at 17:57













What happens when you run the second version?

– ThunderCat
Jun 1 '15 at 17:59





What happens when you run the second version?

– ThunderCat
Jun 1 '15 at 17:59













If listOfUrls has say 4 urls, It prints ("Getting url:") from getBodyUrls four times, and then it prints zeroes for length also four times... In theory it should print "Done url: " from getBodyUrls, and print correct size...

– MikeKlemin
Jun 1 '15 at 18:02







If listOfUrls has say 4 urls, It prints ("Getting url:") from getBodyUrls four times, and then it prints zeroes for length also four times... In theory it should print "Done url: " from getBodyUrls, and print correct size...

– MikeKlemin
Jun 1 '15 at 18:02















It's not possible to comment on what's going on because none of the print statements mentioned in your comment are in the code that you have shown.

– ThunderCat
Jun 1 '15 at 18:08





It's not possible to comment on what's going on because none of the print statements mentioned in your comment are in the code that you have shown.

– ThunderCat
Jun 1 '15 at 18:08












1 Answer
1






active

oldest

votes


















2














All of the goroutines are sharing the single myurl variable. See https://golang.org/doc/faq#closures_and_goroutines for more information.



Change the code to:



func f(listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
go func(myurl string){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}(myurl)
}
wg.Wait()
}


or



func f(listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
myurl := myurl
go func(){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}()
}
wg.Wait()
}





share|improve this answer


























  • Thank you. Please, if my edit with addition to start topic, makes sense?

    – MikeKlemin
    Jun 1 '15 at 17:54











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f30579752%2fsync-waitgroup-doesnt-waits%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









2














All of the goroutines are sharing the single myurl variable. See https://golang.org/doc/faq#closures_and_goroutines for more information.



Change the code to:



func f(listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
go func(myurl string){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}(myurl)
}
wg.Wait()
}


or



func f(listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
myurl := myurl
go func(){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}()
}
wg.Wait()
}





share|improve this answer


























  • Thank you. Please, if my edit with addition to start topic, makes sense?

    – MikeKlemin
    Jun 1 '15 at 17:54
















2














All of the goroutines are sharing the single myurl variable. See https://golang.org/doc/faq#closures_and_goroutines for more information.



Change the code to:



func f(listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
go func(myurl string){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}(myurl)
}
wg.Wait()
}


or



func f(listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
myurl := myurl
go func(){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}()
}
wg.Wait()
}





share|improve this answer


























  • Thank you. Please, if my edit with addition to start topic, makes sense?

    – MikeKlemin
    Jun 1 '15 at 17:54














2












2








2







All of the goroutines are sharing the single myurl variable. See https://golang.org/doc/faq#closures_and_goroutines for more information.



Change the code to:



func f(listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
go func(myurl string){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}(myurl)
}
wg.Wait()
}


or



func f(listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
myurl := myurl
go func(){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}()
}
wg.Wait()
}





share|improve this answer















All of the goroutines are sharing the single myurl variable. See https://golang.org/doc/faq#closures_and_goroutines for more information.



Change the code to:



func f(listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
go func(myurl string){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}(myurl)
}
wg.Wait()
}


or



func f(listOfUrls string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
myurl := myurl
go func(){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}()
}
wg.Wait()
}






share|improve this answer














share|improve this answer



share|improve this answer








edited Jun 1 '15 at 17:50

























answered Jun 1 '15 at 17:45









ThunderCatThunderCat

53k56686




53k56686













  • Thank you. Please, if my edit with addition to start topic, makes sense?

    – MikeKlemin
    Jun 1 '15 at 17:54



















  • Thank you. Please, if my edit with addition to start topic, makes sense?

    – MikeKlemin
    Jun 1 '15 at 17:54

















Thank you. Please, if my edit with addition to start topic, makes sense?

– MikeKlemin
Jun 1 '15 at 17:54





Thank you. Please, if my edit with addition to start topic, makes sense?

– MikeKlemin
Jun 1 '15 at 17:54




















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f30579752%2fsync-waitgroup-doesnt-waits%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

mysqli_query(): Empty query in /home/lucindabrummitt/public_html/blog/wp-includes/wp-db.php on line 1924

How to change which sound is reproduced for terminal bell?

Can I use Tabulator js library in my java Spring + Thymeleaf project?