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 サイトの他の関連記事を参照してください。