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
Lepaskan: 2024-12-18 14:16:15
asal
544 orang telah melayarinya

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{}
    Salin selepas log masuk
  • Menerima daripada Kosong Saluran:

    <-make(chan int)
    Salin selepas log masuk
  • Menerima daripada Saluran Tiada:

    <-(chan int)(nil)
    Salin selepas log masuk
  • Menghantar kepada Nil Saluran:

    (chan int)(nil) <- 0
    Salin selepas log masuk
  • Mengunci Mutex Terkunci:

    mu := sync.Mutex{}
    mu.Lock()
    mu.Lock()
    Salin selepas log masuk

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

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

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

for {
    time.Sleep(time.Duration(1<<63 - 1))
}
Salin selepas log masuk

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!

sumber:php.cn
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