>백엔드 개발 >Golang >Windows에서 My Go 애플리케이션의 인스턴스가 하나만 실행되도록 하려면 어떻게 해야 합니까?

Windows에서 My Go 애플리케이션의 인스턴스가 하나만 실행되도록 하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-28 02:12:14846검색

How Can I Ensure Only One Instance of My Go Application Runs on Windows?

Windows에서 Golang을 사용하여 단일 인스턴스 실행 파일 얻기

실행 파일의 여러 인스턴스를 실행하면 예상치 못한 동작과 리소스 경합이 발생할 수 있습니다. 이를 방지하려면 Golang 애플리케이션을 단일 활성 인스턴스로 제한할 수 있습니다.

인스턴스 제어를 위해 전역 뮤텍스 사용

단일 인스턴스 실행을 적용하는 일반적인 접근 방식 글로벌 뮤텍스를 사용하는 것입니다. 뮤텍스 또는 상호 배제 개체를 사용하면 주어진 시간에 하나의 프로세스만 공유 리소스에 독점적으로 액세스할 수 있습니다. 이 경우 공유 리소스는 실행 중인 실행 파일입니다.

Windows에서의 구현

Windows용 Golang에서 전역 뮤텍스를 생성하려면 kernel32.dll에서 제공하는 CreateMutexW 함수입니다. 이 함수는 뮤텍스 이름을 포함하여 여러 인수를 사용합니다. 사용자 간 세션 호환성을 위해 뮤텍스 이름 앞에 "Global"을 붙이는 것이 좋습니다.

제공된 코드 조각에는 CreateMutex라는 함수가 정의되어 CreateMutexW를 추상화합니다. 기능. 이 함수를 사용하여 "SomeMutexName"과 같은 고유한 이름을 전달하여 전역 뮤텍스를 생성할 수 있습니다.

수정된 코드 조각은 다음과 같습니다.

import (
    "syscall"
    "unsafe"
)

var (
    kernel32        = syscall.NewLazyDLL("kernel32.dll")
    procCreateMutex = kernel32.NewProc("CreateMutexW")
)

func CreateMutex(name string) (uintptr, error) {
    ret, _, err := procCreateMutex.Call(
        0,
        0,
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(name))),
    )
    switch int(err.(syscall.Errno)) {
    case 0:
        return ret, nil
    default:
        return ret, err
    }
}

// mutexName starting with "Global\" will work across all user sessions
_, err := CreateMutex("SomeMutexName")

전역 뮤텍스 생성 및 설정 , Golang 애플리케이션은 한 번에 하나의 인스턴스만 실행되도록 보장할 수 있습니다. 다른 인스턴스가 실행을 시도하면 초기 인스턴스가 종료될 때까지 차단되어 실행 파일을 단일 활성 인스턴스로 효과적으로 제한합니다.

위 내용은 Windows에서 My Go 애플리케이션의 인스턴스가 하나만 실행되도록 하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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