sync.WaitGroup doesnt waits
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
|
show 2 more comments
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
2
You have a racecondition in your code onmyurl
. 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
|
show 2 more comments
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
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
concurrency go
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 onmyurl
. 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
|
show 2 more comments
2
You have a racecondition in your code onmyurl
. 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
|
show 2 more comments
1 Answer
1
active
oldest
votes
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()
}
Thank you. Please, if my edit with addition to start topic, makes sense?
– MikeKlemin
Jun 1 '15 at 17:54
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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()
}
Thank you. Please, if my edit with addition to start topic, makes sense?
– MikeKlemin
Jun 1 '15 at 17:54
add a comment |
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()
}
Thank you. Please, if my edit with addition to start topic, makes sense?
– MikeKlemin
Jun 1 '15 at 17:54
add a comment |
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()
}
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()
}
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
add a comment |
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
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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