목차
인터페이스 호출" >인터페이스 호출
信号通知" >信号通知
总结" >总结
백엔드 개발 Golang Go 프로그램의 핫스위치 기능을 좀 더 멋지게 구현하는 방법

Go 프로그램의 핫스위치 기능을 좀 더 멋지게 구현하는 방법

Jul 21, 2023 pm 12:00 PM
프로그램을 가다

개발 중에 열 스위치가 필요한 경우가 종종 있습니다. 즉, 프로그램이 실행되는 동안 적절한 시간에 특정 기능을 켜거나 끌 수 있습니다. 예를 들어 성능 분석에 사용되는 pprof 샘플링은 일반적인 열 스위치입니다. 이 기사에서는 이 열 스위치를 더 시원하게 만드는 방법에 대해 설명합니다.

새로운 솔루션을 소개하기 전에 Go 프로그램에서 pprof가 어떻게 수행되는지 살펴보겠습니다.

인터페이스 호출

프로그램의 성능 샘플링은 서비스 성능에 영향을 줄 수 있습니다. 따라서 온라인 샘플링은 일반적으로 지정된 작은 시간 범위 내에서 수행되며 효과적인 스위치 제어가 필요합니다.

이를 위해 일반적으로 net/http/pprof 패키지(init 함수는 라우팅 함수 함수에 바인딩됨)를 코드에 도입합니다. 지정된 포트의 HTTP 서비스에 외부적으로 접근할 경우 샘플링 기능이 활성화되며, 샘플링 시간이 지나면 수집이 비활성화됩니다.

구현 코드는 다음과 같습니다

package main

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

func main() {
 go func() {
  _ = http.ListenAndServe(":8080", nil)
 }()
 ...
}
로그인 후 복사

물론 이 접근 방식에는 문제가 없습니다. 우리는 그것을 배우고 다른 스위치 기능을 HTTP 서비스로 만들 수 있습니다. 그런데 다른 더 멋진 방법은 없을까요?

信号通知

信号处理与 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
   }
  }
 }()
}
로그인 후 복사

在上述函数中,我们定义了接收信号通道<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))
 ...
}
로그인 후 복사

在 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))
  }
 }()
}
로그인 후 복사

总结

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

위 내용은 Go 프로그램의 핫스위치 기능을 좀 더 멋지게 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Go 프로그램의 핫스위치 기능을 좀 더 멋지게 구현하는 방법 Go 프로그램의 핫스위치 기능을 좀 더 멋지게 구현하는 방법 Jul 21, 2023 pm 12:00 PM

개발 중에 열 스위치가 필요한 경우가 종종 있습니다. 즉, 프로그램이 실행되는 동안 적절한 시간에 특정 기능을 켜거나 끌 수 있습니다. 예를 들어 성능 분석에 사용되는 pprof 샘플링은 일반적인 열 스위치입니다. 이 기사에서는 이 열 스위치를 더 시원하게 만드는 방법에 대해 설명합니다.

expvar를 사용하여 Go 프로그램 실행 측정항목 노출 expvar를 사용하여 Go 프로그램 실행 측정항목 노출 Jul 21, 2023 am 09:52 AM

애플리케이션의 실행 지표를 얻으면 애플리케이션이 실제로 어떻게 작동하는지 더 잘 이해할 수 있습니다. 이러한 지표를 프로메테우스(prometheus), 자빅스(zabbix) 등의 모니터링 시스템에 연결하면 애플리케이션을 지속적으로 감지하고 이상 징후를 적시에 경고하고 처리할 수 있습니다.

종속성 누락으로 인해 Go 프로그램이 컴파일되지 않는 이유는 무엇입니까? 종속성 누락으로 인해 Go 프로그램이 컴파일되지 않는 이유는 무엇입니까? Jun 10, 2023 pm 02:33 PM

Go는 다른 프로그래밍 언어에 비해 더 빠르게 컴파일되고 더 적은 메모리를 소비하는 인기 있는 프로그래밍 언어입니다. 그러나 때때로 Go 프로그램은 종속성 누락으로 인해 컴파일에 실패합니다. 그렇다면 왜 이런 일이 발생합니까? 먼저 Go 컴파일의 원리를 이해해야 합니다. Go는 정적으로 컴파일되는 언어입니다. 즉, 컴파일 중에 프로그램이 기계어 코드로 변환된 다음 직접 실행됩니다. 동적으로 컴파일되는 언어와 비교할 때 Go의 컴파일 프로세스는 사용되는 모든 패키지를 컴파일하기 전에 변환해야 하기 때문에 더 복잡합니다.

내 Go 프로그램이 GoQUIC 라이브러리를 올바르게 사용하지 않는 이유는 무엇입니까? 내 Go 프로그램이 GoQUIC 라이브러리를 올바르게 사용하지 않는 이유는 무엇입니까? Jun 09, 2023 pm 04:55 PM

최근 점점 더 많은 사람들이 GoQUIC을 사용하여 웹 애플리케이션을 구축하기 시작했습니다. 효율적인 전송 성능과 신뢰성으로 인해 GoQUIC은 많은 프로젝트에서 첫 번째 선택이 되었습니다. 그러나 실제 사용 중에 일부 개발자는 Go 프로그램이 GoQUIC 라이브러리를 올바르게 사용할 수 없다는 사실을 발견했습니다. 다음으로 Go 프로그램이 GoQUIC 라이브러리를 정상적으로 사용할 수 없게 되는 원인을 분석해 보겠습니다. 1. 버전 문제 먼저 GoQUIC 버전이 최신인지 확인해야 합니다. GoQUIC은 다음과 같은 경우 자주 업데이트됩니다.

Go 프로그램이 너무 큽니다. 지연 초기화를 사용할 수 있나요? Go 프로그램이 너무 큽니다. 지연 초기화를 사용할 수 있나요? Aug 04, 2023 pm 05:23 PM

회사의 지속적인 발전에서 대부분은 처음에는 대규모 단위였으며 변화가 느렸습니다. 창고는 10년 이상 사용될 예정이며 창고의 규모는 기본적으로 지속적인 증가 과정입니다.

Go 프로그램을 실행할 때 '메모리 부족' 오류가 발생하는 이유는 무엇입니까? Go 프로그램을 실행할 때 '메모리 부족' 오류가 발생하는 이유는 무엇입니까? Jun 09, 2023 pm 04:40 PM

Go는 메모리 관리를 위한 특별한 메커니즘을 제공하는 효율적인 프로그래밍 언어입니다. 그러나 이 언어를 사용하더라도 "메모리 부족" 오류와 같은 일부 문제가 발생할 수 있습니다. 그러면 내 Go 프로그램에서 왜 이 오류가 발생합니까? 메모리 누수 메모리 누수는 Go 언어에도 존재하는 일반적인 문제입니다. 메모리 누수는 Go 프로그램이 많은 양의 메모리를 할당하고 특정 작업을 수행한 후 완전히 해제하지 않을 때 발생합니다. 메모리 누수가 발생하는 경우

Go 프로그램의 예외 처리가 작동하지 않는 이유는 무엇입니까? Go 프로그램의 예외 처리가 작동하지 않는 이유는 무엇입니까? Jun 10, 2023 am 10:13 AM

Golang(Go)은 오류와 예외를 처리하는 데 매우 능숙한 언어입니다. 다른 언어와 달리 Go는 간단하면서도 효과적인 오류 처리 메커니즘을 통해 예외를 처리합니다. Go의 오류 처리 메커니즘은 매우 강력하고 유연하지만 일부 프로그래머는 여전히 프로그램에서 오류 처리를 구현하는 데 어려움을 겪고 있습니다. 이 글은 Go 프로그램에서 예외 처리가 작동하지 않는 이유와 예외 상황을 올바르게 처리하는 방법에 대한 질문을 해결하는 데 도움을 주기 위해 작성되었습니다. Go에서 비효율적인 예외 처리는 일반적으로 프로그래머가 오류를 올바르게 처리하지 않거나 실수를 함으로써 발생합니다.

내 Go 프로그램이 실행될 때 '코어 덤프' 오류가 발생하는 이유는 무엇입니까? 내 Go 프로그램이 실행될 때 '코어 덤프' 오류가 발생하는 이유는 무엇입니까? Jun 09, 2023 pm 05:49 PM

Go 언어를 사용하여 개발하는 과정에서 다양한 오류에 직면하게 되는 것은 불가피합니다. 일반적인 오류 중 하나는 "코어 덤프"이며, 이 오류 메시지는 일부 개발자에게 혼란을 줄 수 있습니다. 이 문서에서는 이 오류의 원인과 해결 방법을 설명합니다. "coredumped"의 의미 Linux 운영 체제에서 "coredumped"는 프로세스가 실행 중에 예기치 않게 종료되어 소위 "core" 파일이 생성되었음을 나타내는 오류 메시지입니다. 이것

See all articles