Ok, thanks that makes sense! On Wednesday, April 6, 2022 at 6:56:42 PM UTC+2 Brian Candler wrote:
> > Is there maybe something blocking involved in http.Get()? > > Yes of course - first establishing a TCP connection across the network, > then sending data over it and waiting for the response. > > Each of these is a point where the goroutine gets descheduled because it > has nothing more to do; it's waiting for an external event which may not > come for several milliseconds (an aeon in computer time). > > On Wednesday, 6 April 2022 at 14:43:15 UTC+1 golf_mike wrote: > >> Hi, >> >> As a fun way of getting into Go I decided to create a "random" number >> generator by timing a number of requests to a specific URL, and reducing >> the results to one number. For practice pusposes I made a "naive" version >> with just a for loop and a version that uses goroutines. >> As I am interested in the timings for each individual request, there was >> an interesting result. Implemented in the for loop, each request was timed >> as expected. For the goroutines however the timings incremented for each >> individual timing, where the last timing was equal or a microsecond or so >> below the total timing for all requests. >> Upon further inspection, it seems that the time.Now() for the startTime >> is called almost immediately for all, but the time.Now() for the stopSub is >> called much later. >> How is it possible that all goroutines start execution at the same time, >> but finish not at the same time? Is there maybe something blocking involved >> in http.Get()? >> I posted all code for this on Stackoverflow a couple of days ago but no >> answers there yet (go - Unexpected behaviour of time.Now() in goroutine >> - Stack Overflow >> <https://stackoverflow.com/questions/71737286/unexpected-behaviour-of-time-now-in-goroutine>). >> >> See below for the goroutine and how it is called. >> >> Execution of goroutines: >> *start := time.Now()* >> * ch := make(chan int64, 100)* >> * url := "https://www.nu.nl <https://www.nu.nl>"* >> * for i := 0; i < len(timings_parallel); i++ {* >> * wg.Add(1)* >> * go func() {* >> * defer wg.Done()* >> * doGet(url, ch)* >> * }()* >> * }* >> * wg.Wait()* >> * close(ch)* >> * // feed the results from the channel into the result array* >> * count := 0* >> * for ret := range ch {* >> * timings_parallel[count] = ret* >> * count++* >> * }* >> * // get total running time for this part* >> * time_parallel := time.Since(start).Milliseconds()* >> Goroutine: >> *func doGet(address string, channel chan int64) {* >> * startTime := time.Now()* >> * startSub := startTime.UnixMilli()* >> >> * _, err := http.Get(address)* >> * if err != nil {* >> * log.Fatalln(err)* >> * }* >> * stopSub := time.Now().UnixMilli()* >> * delta := stopSub - startSub* >> >> * channel <- delta* >> *}* >> >> >> -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/be3bb29b-1924-4586-8208-3d25f29e7816n%40googlegroups.com.