Heim >Backend-Entwicklung >Golang >Wie kann ich sicherstellen, dass nur eine Instanz meiner Go-Anwendung unter Windows ausgeführt wird?

Wie kann ich sicherstellen, dass nur eine Instanz meiner Go-Anwendung unter Windows ausgeführt wird?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-28 02:12:14846Durchsuche

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

Erstellen einer einzelnen ausführbaren Instanz mit Golang unter Windows

Das Ausführen mehrerer Instanzen einer ausführbaren Datei kann zu unerwartetem Verhalten und Ressourcenkonflikten führen. Um dies zu verhindern, möchten Sie möglicherweise Ihre Golang-Anwendung auf eine einzelne aktive Instanz beschränken.

Global Mutex für die Instanzsteuerung verwenden

Ein gängiger Ansatz, um die Ausführung einer einzelnen Instanz zu erzwingen erfolgt durch die Verwendung eines globalen Mutex. Ein Mutex oder Objekt mit gegenseitigem Ausschluss ermöglicht es jeweils nur einem Prozess, exklusiven Zugriff auf eine gemeinsam genutzte Ressource zu erhalten. In diesem Fall ist unsere gemeinsame Ressource die laufende ausführbare Datei.

Implementierung unter Windows

Um einen globalen Mutex in Golang für Windows zu erstellen, können Sie verwenden CreateMutexW-Funktion, bereitgestellt von der kernel32.dll. Diese Funktion benötigt mehrere Argumente, einschließlich des Namens des Mutex. Aus Gründen der benutzerübergreifenden Sitzungskompatibilität wird empfohlen, dem Mutex-Namen „Global“ voranzustellen.

Im bereitgestellten Code-Snippet ist eine Funktion namens CreateMutex definiert, die CreateMutexW abstrahiert Funktion. Mit dieser Funktion können Sie einen globalen Mutex erstellen, indem Sie einen eindeutigen Namen übergeben, z. B. „SomeMutexName“.

Hier ist der geänderte Codeausschnitt:

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")

Durch Erstellen und Festlegen eines globalen Mutex , kann Ihre Golang-Anwendung sicherstellen, dass jeweils nur eine Instanz ausgeführt wird. Wenn eine andere Instanz versucht auszuführen, wird sie blockiert, bis die ursprüngliche Instanz beendet wird, wodurch die ausführbare Datei effektiv auf eine einzelne aktive Instanz beschränkt wird.

Das obige ist der detaillierte Inhalt vonWie kann ich sicherstellen, dass nur eine Instanz meiner Go-Anwendung unter Windows 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