Maison  >  Article  >  développement back-end  >  Comment puis-je m'assurer qu'une seule instance de mon application Go s'exécute sous Windows ?

Comment puis-je m'assurer qu'une seule instance de mon application Go s'exécute sous Windows ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-28 02:12:14820parcourir

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

Réaliser un exécutable à instance unique avec Golang sous Windows

L'exécution de plusieurs instances d'un exécutable peut entraîner des comportements inattendus et des conflits de ressources. Pour éviter cela, vous souhaiterez peut-être limiter votre application Golang à une seule instance active.

Utilisation de Global Mutex pour le contrôle d'instance

Une approche courante pour appliquer l'exécution d'une seule instance se fait grâce à l’utilisation d’un mutex global. Un mutex, ou objet d'exclusion mutuelle, permet à un seul processus d'obtenir un accès exclusif à une ressource partagée à un moment donné. Dans ce cas, notre ressource partagée est l'exécutable en cours d'exécution.

Implémentation sous Windows

Pour créer un mutex global dans Golang pour Windows, vous pouvez utiliser le Fonction CreateMutexW fournie par le kernel32.dll. Cette fonction prend plusieurs arguments, dont le nom du mutex. Pour la compatibilité des sessions entre utilisateurs, il est recommandé de préfixer le nom du mutex avec "Global".

Dans l'extrait de code fourni, une fonction appelée CreateMutex est définie qui résume le CreateMutexW fonction. Vous pouvez utiliser cette fonction pour créer un mutex global en passant un nom unique, tel que "SomeMutexName".

Voici l'extrait de code modifié :

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

En créant et en définissant un mutex global , votre application Golang peut garantir qu'une seule instance est exécutée à la fois. Si une autre instance tente de s'exécuter, elle sera bloquée jusqu'à ce que l'instance initiale se termine, limitant ainsi l'exécutable à une seule instance active.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn