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.

Reply via email to