Jadual Kandungan
Panggilan antara muka" >Panggilan antara muka
信号通知" >信号通知
总结" >总结
Rumah pembangunan bahagian belakang Golang Bagaimana untuk melaksanakan fungsi suis panas program Go dengan lebih sejuk

Bagaimana untuk melaksanakan fungsi suis panas program Go dengan lebih sejuk

Jul 21, 2023 pm 12:00 PM
pergi program

Semasa pembangunan, kita sering memerlukan suis haba, iaitu fungsi tertentu boleh dihidupkan atau dimatikan pada masa yang sesuai semasa program sedang berjalan. Sebagai contoh, pensampelan pprof yang digunakan dalam analisis prestasi ialah suis haba biasa. Artikel ini membincangkan cara menjadikan suis terma ini lebih sejuk.

Sebelum memperkenalkan penyelesaian baharu, mari semak cara pprof dilakukan dalam program Go.

Panggilan antara muka

Pensampelan prestasi program mungkin menjejaskan keupayaan perkhidmatannya. Oleh itu, pensampelan dalam talian biasanya dilakukan dalam julat masa kecil yang ditentukan dan memerlukan kawalan suis yang berkesan.

Untuk melakukan ini, kami biasanya memperkenalkan pakej net/http/pprof (fungsi initnya terikat kepada fungsi fungsi penghalaan) ke dalam kod. Fungsi pensampelan dihidupkan apabila mengakses perkhidmatan HTTP port yang ditentukan secara luaran Selepas masa pensampelan tamat, pengumpulan dimatikan.

Kod pelaksanaan adalah seperti berikut

package main

import (
 "net/http"
 _ "net/http/pprof"
)

func main() {
 go func() {
  _ = http.ListenAndServe(":8080", nil)
 }()
 ...
}
Salin selepas log masuk

Sudah tentu tiada masalah dengan pendekatan ini. Kami boleh mempelajarinya dan membuat fungsi penukaran lain ke dalam perkhidmatan HTTP. Tetapi, adakah cara lain yang lebih sejuk?

信号通知

信号处理与 Go 程序的优雅退出一文中,我们谈论过信号机制,它用以向应用程序发送某种事件通知。

我们可以将基于接口触发的方式改为信号通知。

首先,构造采样功能函数(对应于 net/http/pprof 包下 init 函数中绑定的路由功能函数)。

func RegisterSignalForProfiling(sig os.Signal) {
 ch := make(chan os.Signal)
 started := false
 signal.Notify(ch, sig)

 go func() {
  var memoryProfile, cpuProfile, traceProfile *os.File
  for range ch {
   if started {
    pprof.StopCPUProfile()
    trace.Stop()
    pprof.WriteHeapProfile(memoryProfile)
    memoryProfile.Close()
    cpuProfile.Close()
    traceProfile.Close()
    started = false
   } else {
    cpuProfile, _ = os.Create("cpu.pprof")
    memoryProfile, _ = os.Create("memory.pprof")
    traceProfile, _ = os.Create("runtime.trace")
    pprof.StartCPUProfile(cpuProfile)
    trace.Start(traceProfile)
    started = true
   }
  }
 }()
}
Salin selepas log masuk

在上述函数中,我们定义了接收信号通道<span style="font-size: 15px;">ch</span>,通过<span style="font-size: 15px;">signal.Notify(ch, sig)</span>将指定的通知信号<span style="font-size: 15px;">sig</span><span style="font-size: 15px;">ch</span>进行绑定。<span style="font-size: 15px;">for range ch</span> 将阻塞等待外部信号<span style="font-size: 15px;">sig</span>,随着<span style="font-size: 15px;">sig</span>信号的到来,交替进入开启或关闭采样的逻辑。

<span style="font-size: 15px;">main</span>函数中,就可以这样替代<span style="font-size: 15px;">http.ListenAndServe(":8080", nil)</span>了。

package main

import (
  "syscall"
  ...
)

func main() {
  RegisterSignalForProfiling(syscall.Signal(31))
 ...
}
Salin selepas log masuk

在 linux 系统,可以通过<span style="font-size: 15px;">kill -signal_number pid</span>命令向程序发送指定信号。

如上代码所示,我们硬编码指定的采样开关信号值是 31。因此,当程序运行起来后,我们在控制台输入<span style="font-size: 15px;">kill -31 pid</span> 命令,即可开启采样,再次输入<span style="font-size: 15px;">kill -31 pid</span>命令,就关闭了采样。

依葫芦画瓢,我们再来一个打印 goroutine 堆栈信息的热开关函数,是不是很酷?

func RegisterSignalForPrintStack(sig os.Signal) {
 ch := make(chan os.Signal)
 signal.Notify(ch, sig)

 go func() {
  for range ch {
   buffer := make([]byte, 1024*1024*4)
   runtime.Stack(buffer, true)
   fmt.Println(string(buffer))
  }
 }()
}
Salin selepas log masuk

总结

热开关是一个很简单常用的功能,无非是选择何种触发与等待方式。基于接口的调用更适合于远程控制,基于信号则便于本地控制。

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan fungsi suis panas program Go dengan lebih sejuk. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk melaksanakan fungsi suis panas program Go dengan lebih sejuk Bagaimana untuk melaksanakan fungsi suis panas program Go dengan lebih sejuk Jul 21, 2023 pm 12:00 PM

Semasa pembangunan, kita sering memerlukan suis terma, iaitu, fungsi tertentu boleh dihidupkan atau dimatikan pada masa yang sesuai semasa program sedang berjalan. Sebagai contoh, pensampelan pprof yang digunakan dalam analisis prestasi ialah suis haba biasa. Artikel ini membincangkan cara menjadikan suis terma ini lebih sejuk.

Gunakan expvar untuk mendedahkan metrik berjalan program Go Gunakan expvar untuk mendedahkan metrik berjalan program Go Jul 21, 2023 am 09:52 AM

Mendapatkan metrik berjalan aplikasi boleh memberi kita pemahaman yang lebih baik tentang prestasi aplikasi itu sebenarnya. Dengan menyambungkan penunjuk ini kepada sistem pemantauan seperti prometheus dan zabbix, aplikasi boleh dikesan secara berterusan, dan keabnormalan boleh dimaklumkan dan dikendalikan tepat pada masanya.

Mengapa program Go saya gagal dikompilasi kerana kebergantungan yang hilang? Mengapa program Go saya gagal dikompilasi kerana kebergantungan yang hilang? Jun 10, 2023 pm 02:33 PM

Go ialah bahasa pengaturcaraan popular yang menyusun lebih cepat dan menggunakan kurang memori berbanding bahasa pengaturcaraan lain. Walau bagaimanapun, kadangkala program Go kami gagal disusun kerana kebergantungan yang tiada. Jadi mengapa ini berlaku? Pertama, kita perlu memahami prinsip kompilasi Go. Go ialah bahasa yang disusun secara statik, yang bermaksud bahawa program diterjemahkan ke dalam kod mesin semasa penyusunan dan kemudian dijalankan secara langsung. Berbanding dengan bahasa yang disusun secara dinamik, proses penyusunan Go adalah lebih rumit kerana semua pakej yang akan digunakan perlu ditukar sebelum penyusunan.

Mengapa program Go saya tidak menggunakan perpustakaan GoQUIC dengan betul? Mengapa program Go saya tidak menggunakan perpustakaan GoQUIC dengan betul? Jun 09, 2023 pm 04:55 PM

Baru-baru ini, semakin ramai orang mula menggunakan GoQUIC untuk membina aplikasi web. Oleh kerana prestasi penghantaran yang cekap dan kebolehpercayaan, GoQUIC telah menjadi pilihan pertama untuk banyak projek. Walau bagaimanapun, semasa penggunaan sebenar, sesetengah pembangun mendapati bahawa program Go mereka tidak dapat menggunakan perpustakaan GoQUIC dengan betul. Seterusnya, mari analisa sebab yang mungkin menyebabkan program Go tidak dapat menggunakan perpustakaan GoQUIC secara normal. 1. Isu versi Pertama, anda perlu memastikan versi GoQUIC anda adalah yang terkini. GoQUIC dikemas kini dengan kerap jika

Program Go terlalu besar. Bolehkah kita menggunakan pengamulaan malas? Program Go terlalu besar. Bolehkah kita menggunakan pengamulaan malas? Aug 04, 2023 pm 05:23 PM

Dalam pembangunan berterusan syarikat, kebanyakannya adalah unit yang besar pada mulanya, dan transformasi adalah perlahan Sebuah gudang akan digunakan selama lebih daripada sepuluh tahun, dan skala gudang pada dasarnya adalah proses peningkatan berterusan.

Mengapa pengendalian pengecualian dalam program Go saya tidak berfungsi? Mengapa pengendalian pengecualian dalam program Go saya tidak berfungsi? Jun 10, 2023 am 10:13 AM

Golang (Go) adalah bahasa yang sangat baik dalam mengendalikan ralat dan pengecualian. Tidak seperti bahasa lain, Go mengendalikan pengecualian melalui mekanisme pengendalian ralat yang mudah namun berkesan. Walaupun mekanisme pengendalian ralat Go sangat berkuasa dan fleksibel, sesetengah pengaturcara masih menghadapi masalah untuk melaksanakan pengendalian ralat dalam program mereka. Artikel ini bertujuan untuk membantu menangani persoalan mengapa pengendalian pengecualian dalam program Go tidak berfungsi dan cara mengendalikan situasi pengecualian dengan betul. Pengendalian pengecualian yang tidak berkesan dalam Go biasanya disebabkan oleh pengaturcara yang tidak mengendalikan ralat dengan betul atau membuat kesilapan

Mengapa saya mendapat ralat 'kehabisan memori' semasa menjalankan program Go saya? Mengapa saya mendapat ralat 'kehabisan memori' semasa menjalankan program Go saya? Jun 09, 2023 pm 04:40 PM

Go ialah bahasa pengaturcaraan yang cekap yang menyediakan mekanisme khas untuk pengurusan memori. Walau bagaimanapun, walaupun semasa menggunakan bahasa ini beberapa masalah mungkin berlaku, seperti ralat "outofmemory". Jadi mengapa program Go saya mendapat ralat ini? Kebocoran memori Kebocoran memori ialah masalah biasa, yang juga wujud dalam bahasa Go. Kebocoran memori berlaku apabila program Go anda memperuntukkan sejumlah besar memori dan tidak membebaskannya sepenuhnya selepas melakukan operasi tertentu. Jika kebocoran ingatan berlaku

Mengapakah program Go saya mendapat ralat 'dibuang teras' semasa melaksanakan? Mengapakah program Go saya mendapat ralat 'dibuang teras' semasa melaksanakan? Jun 09, 2023 pm 05:49 PM

Dalam proses membangunkan menggunakan bahasa Go, tidak dapat dielakkan bahawa anda akan menghadapi pelbagai ralat. Salah satu ralat biasa ialah "coredumped", dan mesej ralat ini mungkin mengelirukan sesetengah pembangun. Artikel ini menerangkan punca ralat ini dan cara membetulkannya. Maksud "coredumped" Dalam sistem pengendalian Linux, "coredumped" ialah mesej ralat yang menunjukkan bahawa proses tanpa diduga keluar semasa pelaksanaan dan apa yang dipanggil fail "teras" telah dihasilkan. ini

See all articles