Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

Bu örnekte bir goroutin çalıştıracağız ve işini bitirmesini bekleyeceğiz. Ancak, işini en fazla 3 saniyede bitirmesine izin veriyoruz. Daha uzun sürerse, zaman aşımına zorlayacağız. Bunun için context.WithTimeout kullanacağız.


Örnek


package main

import (
"context"
"fmt"
"math/rand"
"time"
)

func main() {
fmt.Println(">>>>> BEGIN")

ctx, cancel := context.WithTimeout(context.Background(), 3 * time.Second)
// Cancel even if everything goes fine without an error to release resources.
defer cancel()

ch := make(chan int)

go doSomething(ch)

select {
case <-ctx.Done():
fmt.Println("TIMEOUT:", ctx.Err())
case t := <-ch:
fmt.Printf("JOB DONE in %d seconds\n", t)
}

fmt.Println(">>>>> END")
}

func doSomething(ch chan<- int) {
// Prevent picking up the same random number all the time for sleeping.
rand.Seed(time.Now().UnixNano())

// Pick a random number to simulate time it takes to finish the job.
delay := rand.Intn(5)
fmt.Printf("RUN: %d seconds\n", delay)
time.Sleep(time.Duration(delay) * time.Second)

ch<- delay
}

Test


>>>>> BEGIN
RUN: 1 seconds
JOB DONE in 1 seconds
>>>>> END

>>>>> BEGIN
RUN: 4 seconds
TIMEOUT: context deadline exceeded
>>>>> END

>>>>> BEGIN
RUN: 5 seconds
TIMEOUT: context deadline exceeded
>>>>> END

>>>>> BEGIN
RUN: 3 seconds
JOB DONE in 3 seconds
>>>>> END