Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich sicherstellen, dass unter Windows nur eine Instanz einer ausführbaren Go-Datei ausgeführt wird?

Wie kann ich sicherstellen, dass unter Windows nur eine Instanz einer ausführbaren Go-Datei ausgeführt wird?

Barbara Streisand
Barbara StreisandOriginal
2024-11-27 09:24:15393Durchsuche

How Can I Ensure Only One Instance of a Go Executable Runs on Windows?

Beschränkung auf eine einzelne Instanz einer ausführbaren Datei in Go für Windows

Es ist entscheidend, sicherzustellen, dass jeweils nur eine einzige Instanz einer ausführbaren Datei ausgeführt wird, um mehrere Instanzen desselben Programms zu verhindern dadurch, dass Systemressourcen verbraucht oder Konflikte entstehen. In diesem Artikel wird untersucht, wie Sie mithilfe eines globalen Mutex eine Einzelinstanzausführung in Golang für Windows-Systeme erreichen.

Globaler Mutex für die Einzelinstanzsteuerung

Ein globaler Mutex ist ein Synchronisierungsprimitiv, das mehrere Prozesse ermöglicht oder Threads, um den Zugriff auf eine gemeinsam genutzte Ressource zu teilen, indem der gleichzeitige Zugriff verhindert wird. In diesem Fall stellt die Verwendung eines globalen Mutex namens „SomeMutexName“ über alle Benutzersitzungen hinweg sicher, dass nur eine einzige Instanz der ausführbaren Datei ausgeführt werden kann.

Code-Implementierung

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
    }
}

func main() {
    _, err := CreateMutex("Global\SomeMutexName")
    if err != nil {
        return
    }
}

Architektur der Lösung

Dieser Code initialisiert die Windows-API-Funktion „CreateMutexW“ aus der Bibliothek „kernel32.dll“ mithilfe von syscall-Paket. Anschließend ruft es diese Funktion mit dem globalen Mutex-Namen auf, um einen benannten Mutex zu erstellen. Wenn die Funktion ohne Fehler zurückkehrt, bedeutet dies, dass keine andere Instanz der ausführbaren Datei ausgeführt wird. Andernfalls bedeutet dies, dass bereits eine andere Instanz ausgeführt wird.

Portabilität auf andere Plattformen

Während der bereitgestellte Code dieses spezielle Problem für Windows-Maschinen behebt, ist es erwähnenswert, dass die Global Mutex-Technik nicht portierbar ist auf allen Plattformen. Jede Plattform verfügt über eigene Mechanismen zur Implementierung der Instanzsperre. Auf Unix-ähnlichen Systemen kann beispielsweise ein „Lockfile“-Ansatz oder die „fcntl“-Funktion mit „F_SETLK“ verwendet werden, um eine ähnliche Funktionalität zu erreichen.

Das obige ist der detaillierte Inhalt vonWie kann ich sicherstellen, dass unter Windows nur eine Instanz einer ausführbaren Go-Datei ausgeführt wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn