Rumah >pembangunan bahagian belakang >Golang >Patutkah My Go Main Goroutine Tidur Selamanya atau Berhenti Dengan Anggun?

Patutkah My Go Main Goroutine Tidur Selamanya atau Berhenti Dengan Anggun?

DDD
DDDasal
2024-12-18 14:16:15539semak imbas

Should My Go Main Goroutine Sleep Forever or Gracefully Quit?

Dilema Goroutine Utama: Tidur atau Berhenti?

Pemaju sering menghadapi keperluan untuk memastikan projek Go mereka sentiasa berjalan, menyerupai nyala api abadi yang tidak pernah gagal. Sebaliknya, terdapat keadaan apabila seseorang ingin menamatkan perlaksanaan program dengan anggun. Artikel ini meneroka pilihan yang tersedia untuk senario ini.

"Tidur" Goroutine Utama

Untuk menjadikan goroutine utama tidak aktif, beberapa binaan wujud yang menghalang pelaksanaannya dengan berkesan tanpa menggunakan sumber CPU. Pertimbangkan contoh berikut:

  • Pilih tanpa Kes:

    select{}
  • Menerima daripada Kosong Saluran:

    <-make(chan int)
  • Menerima daripada Saluran Tiada:

    <-(chan int)(nil)
  • Menghantar kepada Nil Saluran:

    (chan int)(nil) <- 0
  • Mengunci Mutex Terkunci:

    mu := sync.Mutex{}
    mu.Lock()
    mu.Lock()

Merangsang Pengakhiran: Berhenti dari Goroutine

Jika objektifnya adalah untuk menyediakan cara untuk penamatan, memperkenalkan saluran berhenti adalah pendekatan yang berdaya maju. Dalam goroutine utama, kod boleh menunggu selama-lamanya untuk isyarat daripada saluran ini. Apabila masanya sudah matang, saluran berhenti boleh ditutup:

var quit = make(chan struct{})

func main() {
    // Startup code...

    // Block until the quit signal arrives:
    <-quit
}

// In a separate goroutine, when termination is requested:
close(quit)

Nota: Menutup saluran berhenti boleh mencetuskan penamatan serta-merta program, mengikut spesifikasi pelaksanaan program Go.

Tidur Tidak Menghalang

Dalam kes di mana menyekat goroutine utama tidak diingini, satu alternatif ialah menggunakan masa.Sleep() dengan tempoh yang meluas. Tempoh maksimum yang dibenarkan ialah lebih kurang 292 tahun:

time.Sleep(time.Duration(1<<63 - 1))

Untuk program yang ditakdirkan untuk bertahan lebih lama daripada tempoh ini, gelung tak terhingga boleh dilaksanakan:

for {
    time.Sleep(time.Duration(1<<63 - 1))
}

Atas ialah kandungan terperinci Patutkah My Go Main Goroutine Tidur Selamanya atau Berhenti Dengan Anggun?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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