Middle
Go-догу контексттин колдонуу учурлары жөнүндө айтып бер.
sobes.tech AI
AIден жооп
Go-дөгү контекст колдонулушу суранычтардын жашоо циклин башкаруу жана горутиндердин аткарылышын көзөмөлдөө үчүн колдонулат. Негизги колдонуу учурлары:
- Болтуртуу: Белгилүү бир суроо менен байланышкан горутиндердин чынжырын болтурганга мүмкүндүк берет. Мисалы, байланышты жабуу же убакыттын өтүшү учурунда.
- Убакыт чеги: Операциянын аяктай турган акыркы мөөнөтүн белгилейт. Эгер операция убакытта аяктабаса, контекст болтурулат. Бул чексиз күтүүнү алдын алат.
- Өзгөчө маалыматтарды өткөрүү: Белгилүү бир суроо менен байланышкан маалыматтарды (мисалы, колдонуучунун ID, трассировка идентификатору) функциялардын чынжырында өзгөртүүсүз өткөрүүгө мүмкүндүк берет.
Колдонуу мисалдары:
-
Белгилүү бир сигнал аркылуу болтуртуу:
пакет main import ( "context" "fmt" "time" ) функция worker(ctx context.Context, id int) { бо { издөө { случай <-ctx.Done(): fmt.Printf("Жумушчу %d үзүлдү\n", id) кайтуу default: fmt.Printf("Жумушчу %d иштеп жатат...\n", id) time.Sleep(500 * time.Millisecond) } } } функция main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Болтуртууну камсыз кылуу го worker(ctx, 1) го worker(ctx, 2) time.Sleep(2 * time.Second) cancel() // Контекстти болтуртуу time.Sleep(500 * time.Millisecond) // Горутиндердин аяктоо үчүн убакыт берүү } -
Убакыт чеги:
пакет main import ( "context" "fmt" "time" ) функция longOperation(ctx context.Context) error { издөө { случай <-time.After(3 * time.Second): // Узак иштөө моделдөө fmt.Println("Операция ийгиликтүү аяктады") return nil случай <-ctx.Done(): fmt.Println("Операция болтурду контекст аркылуу:", ctx.Err()) return ctx.Err() } } функция main() { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() err := longOperation(ctx) эгер err != nil { fmt.Println("Каталар:", err) } } -
Маалыматтарды өткөрүү:
пакет main import ( "context" "fmt" ) type UserKey string const userIDKey UserKey = "userID" func processRequest(ctx context.Context) { userID := ctx.Value(userIDKey).(int) fmt.Printf("Суранычты иштетүү үчүн колдонуучу ID: %d\n", userID) // Кийинки иштетүү userID менен } func main() { ctx := context.WithValue(context.Background(), userIDKey, 123) processRequest(ctx) }