Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menutup proses golang

Bagaimana untuk menutup proses golang

PHPz
PHPzasal
2023-04-14 11:16:53733semak imbas

Golang ialah bahasa pengaturcaraan masa jalan yang kuat yang boleh digunakan untuk membangunkan aplikasi ketersediaan tinggi. Walau bagaimanapun, dalam pembangunan sebenar, kita mungkin menghadapi masalah penutupan proses Dalam kes ini, kita perlu menggunakan beberapa alat dan teknik dalam Golang untuk mengawal penutupan proses.

Artikel ini akan merangkumi primitif, isyarat dan helah lanjutan lain untuk penutupan proses di Golang. Kami akan meneroka topik ini untuk membantu anda memahami dengan lebih baik cara mengawal penutupan proses Golang.

Primitif untuk penutupan proses

Di Golang, cara paling asas untuk menutup proses ialah menggunakan saluran dua hala atau saluran pembatalan. Saluran dua arah ialah jenis saluran yang digunakan di Golang untuk komunikasi antara Goroutine yang berbeza. Saluran pembatalan ialah varian Golang bagi saluran dwiarah yang boleh digunakan untuk berkomunikasi dan membatalkan tugas antara Goroutines.

Di sini, kami akan menggunakan saluran pembatalan untuk menunjukkan cara mengawal penutupan proses. Berikut ialah contoh menggunakan saluran pembatalan untuk mengawal penutupan proses:

func worker(cancel chan struct{}) {
  for {
    select {
      //检查是否收到取消指令
      case <-cancel:
        log.Println("Worker: Stopping the work")
        return
      //正常工作逻辑
      default:
        log.Println("Worker: Doing some work")
        time.Sleep(time.Second * 1)
    }
  }
}

func main() {
  //创建取消通道
  cancel := make(chan struct{})
  
  //启动工作子进程
  go worker(cancel)
  
  //等待一段时间后取消工作
  time.Sleep(time.Second * 5)
  close(cancel)
  
  //等待程序退出
  time.Sleep(time.Second * 1)
}

Dalam contoh ini, kami mencipta fungsi worker untuk mensimulasikan proses pekerja. Fungsi worker menggunakan gelung tak terhingga untuk melaksanakan kerjanya, memanggil pernyataan select setiap kali gelung untuk menyemak sama ada arahan pembatalan telah diterima. Jika diterima, cetak log dan kembalikan, jika tidak laksanakan logik kerja biasa. Dalam fungsi utama, kami mencipta saluran pembatalan, memulakan subproses pekerja dan menunggu lima saat untuk menutup saluran pembatalan untuk menghentikan kerja.

Selepas saluran pembatalan ditutup, fungsi worker akan menerima isyarat cancel dan kemudian ia akan keluar dari gelung dan kembali.

Isyarat untuk penutupan proses

Selain menutup proses dengan membatalkan saluran, kami juga boleh menggunakan isyarat proses untuk mengawal penutupan proses Golang. Isyarat ialah mekanisme komunikasi peringkat sistem pengendalian yang digunakan untuk menyampaikan mesej dan peristiwa dalam sistem. Dalam sistem Linux, isyarat adalah sangat biasa Contohnya, apabila aplikasi sedang dijalankan, jika ia menerima isyarat SIGKILL, ia akan terpaksa ditamatkan. Di Golang, kita boleh menggunakan os.Signal untuk menentukan jenis isyarat dan menggunakan os.Notify untuk melanggan acara isyarat.

Berikut ialah contoh menggunakan isyarat untuk mengawal penutupan proses:

func main() {
  //创建关闭信号
  stop := make(chan os.Signal, 1)
  signal.Notify(stop, os.Interrupt)
  
  //启动工作子进程
  go func() {
    for {
      log.Println("Worker: Doing some work")
      time.Sleep(time.Second * 1)
    }
  }()
  
  //等待收到关闭信号
  <-stop
  log.Println("Main: Got stop signal")
  
  //等待程序退出
  time.Sleep(time.Second * 1)
}

Dalam contoh ini, kami mencipta saluran yang dipanggil stop untuk bertindak balas kepada isyarat penutupan dan menggunakan os.NotifyDatang dan langgan isyarat os.Interrupt. Isyarat os.Interrupt biasanya disebabkan oleh kekunci Ctrl+C. Kami juga memulakan subproses pekerja untuk mensimulasikan kerja dan mengeluarkan beberapa mesej pada konsol.

Dalam fungsi utama, kami menunggu saluran stop menerima data, iaitu menerima isyarat tutup. Apabila ia berlaku, kami mencetak mesej log dan tunggu sebentar untuk membenarkan program keluar.

Penutupan proses yang anggun

Apabila kami menutup proses Golang, terdapat beberapa langkah tambahan yang boleh diambil untuk memastikan proses ditutup dengan anggun. Ini termasuk menutup sambungan lain, menunggu tugasan berjalan selesai, menyimpan data, dsb. Langkah-langkah ini membantu mengelakkan kehilangan data, kerosakan fail dan isu lain.

Berikut ialah contoh yang menunjukkan mengambil langkah tambahan ini apabila menutup proses:

func main() {
  //创建关闭信号
  stop := make(chan os.Signal, 1)
  signal.Notify(stop, os.Interrupt, os.Kill)
  
  //创建TCP服务器
  listener, err := net.Listen("tcp", "localhost:8000")
  if err != nil {
    log.Fatal("Error:", err)
  }
  defer listener.Close()
  
  //启动RPC服务
  srv := rpc.NewServer()
  srv.Register(&MathService{})
  go srv.Accept(listener)
  
  //等待收到关闭信号
  <-stop
  log.Println("Main: Got stop signal")
  
  //关闭服务器
  log.Println("Main: Closing the server")
  listener.Close()
  
  //等待正在运行的任务完成
  log.Println("Main: Waiting for the tasks to finish")
  time.Sleep(time.Second * 3)
  
  //保存数据
  log.Println("Main: Saving the data")
  
  //等待程序退出
  time.Sleep(time.Second * 1)
}

Dalam contoh ini, kami mencipta pelayan TCP, perkhidmatan RPC dan isyarat tutup. Apabila kami menerima isyarat penutupan, kami menutup pelayan dan menunggu tugas yang sedang dijalankan selesai. Akhir sekali, kami menyimpan data ke cakera dan menunggu program untuk keluar.

Ringkasan

Dalam artikel ini, kami memperkenalkan cara menggunakan beberapa alatan dan teknik di Golang untuk mengawal penutupan proses. Kami belajar cara menggunakan saluran pembatalan dan isyarat untuk menutup proses. Selain itu, kami juga membincangkan beberapa teknik untuk menutup proses dengan anggun, seperti menutup sambungan, menunggu tugasan selesai dan menyimpan data.

Petua ini boleh membantu kami memastikan penutupan proses yang anggun dan mengelakkan masalah seperti kehilangan data dan rasuah fail. Sama ada kami sedang membangunkan pelayan web, aplikasi rangkaian atau jenis aplikasi lain, penutupan proses adalah sangat penting.

Atas ialah kandungan terperinci Bagaimana untuk menutup proses golang. 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