ホームページ >バックエンド開発 >Golang >Go アプリケーションのインスタンスが 1 つだけ Windows 上で実行されるようにするにはどうすればよいですか?

Go アプリケーションのインスタンスが 1 つだけ Windows 上で実行されるようにするにはどうすればよいですか?

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 アプリケーションを単一のアクティブなインスタンスに制限することをお勧めします。

インスタンス制御にグローバル ミューテックスを使用する

単一インスタンスの実行を強制する一般的なアプローチこれは、グローバル ミューテックスを使用することによって行われます。ミューテックス (相互排他オブジェクト) を使用すると、常に 1 つのプロセスのみが共有リソースへの排他的アクセスを取得できます。この場合、共有リソースは実行中の実行可能ファイルです。

Windows での実装

Windows 用 Golang でグローバル ミューテックスを作成するには、 を利用できます。 kernel32.dll によって提供される CreateMutexW 関数。この関数は、ミューテックスの名前を含むいくつかの引数を受け取ります。ユーザー間セッションの互換性を確保するために、ミューテックス名に「Global」というプレフィックスを付けることをお勧めします。

提供されたコード スニペットでは、CreateMutexW を抽象化する CreateMutex という関数が定義されています。 機能。この関数を使用して、「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 アプリケーションが一度に 1 つのインスタンスだけを実行できるようになります。別のインスタンスが実行しようとすると、最初のインスタンスが終了するまでブロックされ、実行可能ファイルは単一のアクティブなインスタンスに事実上制限されます。

以上がGo アプリケーションのインスタンスが 1 つだけ Windows 上で実行されるようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。