Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa kita perlu menunggu pilihan dalam Go?

Mengapa kita perlu menunggu pilihan dalam Go?

王林
王林ke hadapan
2024-02-11 08:24:091203semak imbas

Mengapa kita perlu menunggu pilihan dalam Go?

Editor PHP Zimo memperkenalkan: Dalam bahasa Go, pernyataan pilih ialah pernyataan aliran kawalan yang sangat penting Ia digunakan untuk memantau operasi berbilang saluran pada masa yang sama untuk mencapai kawalan serentak. Mengapa anda perlu menunggu untuk pemilihan? Ini kerana dalam pengaturcaraan serentak, kita biasanya perlu memproses data atau peristiwa daripada berbilang saluran pada masa yang sama, dan penyataan pilih boleh membantu kita memantau berbilang saluran Setelah mana-mana satu saluran boleh dikendalikan, operasi yang sepadan akan dilakukan. dengan itu mencapai kesepakatan bersama. Dengan menggunakan pilih, kami boleh mengelak daripada menyekat dan meningkatkan responsif dan keselarasan program dengan berkesan.

Kandungan soalan

Saya baru belajar pembatalan konteks. Inilah kod saya.

package main

import (
  "fmt"
  "context"
)

func main() {
  ctx := context.Background()

  do(ctx)
}

func do(ctx context.Context) {
  ctx, ctxCancel := context.WithCancel(ctx)

  resultCh := make(chan string)

  go terminate(ctx, resultCh)

  resultCh <- "value1"
  resultCh <- "value2"

  fmt.Println("pre cancel")

  ctxCancel()

  fmt.Println("post cancel")
}

func terminate(ctx context.Context, ch <-chan string) {
  for {
    select {
    case <-ctx.Done():
      fmt.Println("terminate")
      return
    case result := <-ch:
      fmt.Println(result)
    }
  }
}

Nak tanya

Mengapa ini berlaku. Apakah pengetahuan yang saya perlukan?

Saya menantikan keluarannya.

Tetapi output sebenar yang diperolehi tidak mengandungi "termination".

value1
value2
pre cancel
terminate
post cancel

Kod tetap

Saya menambah masa.Tidur di bawah fungsi batal. Kemudian output adalah apa yang saya harapkan.

ctxCancel()
time.Sleep(100 * time.Millisecond) // add

Penyelesaian

Seperti yang saya faham, idea teras di sebalik penggunaan pilih ialah menunggu sekurang-kurangnya satu syarat untuk "bersedia". Saya telah sertakan contoh di bawah yang mungkin membantu. Di sini pilih digunakan untuk menunggu nilai diterima daripada saluran ch atau tamat masa 1 saat berlaku.

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)

    go func() {
        // Simulate some time-consuming operation
        time.Sleep(2 * time.Second)
        ch <- 42
    }()

    select {
    case result := <-ch:
        fmt.Println("Received result:", result)
    case <-time.After(1 * time.Second):
        fmt.Println("Timeout reached")
    }
}

Atas ialah kandungan terperinci Mengapa kita perlu menunggu pilihan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam