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

Mengapa kita perlu menunggu pilihan dalam Go?

王林
Lepaskan: 2024-02-11 08:24:09
ke hadapan
1231 orang telah melayarinya

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)
    }
  }
}
Salin selepas log masuk

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
Salin selepas log masuk

Kod tetap

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

ctxCancel()
time.Sleep(100 * time.Millisecond) // add
Salin selepas log masuk

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")
    }
}
Salin selepas log masuk

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

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan