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!