首頁 > 後端開發 > Golang > 主體

如何確保我的 Go 應用程式只有一個實例在 Windows 上運行?

Mary-Kate Olsen
發布: 2024-11-28 02:12:14
原創
820 人瀏覽過

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

在Windows 上使用Golang 實作單一實例可執行檔

執行執行檔的多個執行個體可能會導致意外行為和資源爭用。為了防止這種情況,您可能希望將 Golang 應用程式限制為單一活動實例。

使用全域互斥體進行實例控制

強制單一實例執行的常見方法是透過使用全域互斥體。互斥體或互斥對像只允許一個程序在任何給定時間獲得對共享資源的獨佔存取權。在這種情況下,我們的共享資源是正在運行的可執行檔。

在Windows 上的實作

要在Golang for Windows 中建立全域互斥體,您可以使用 CreateMutexW 函數由 kernel32.dll 提供。此函數需要幾個參數,包括互斥體的名稱。為了跨使用者會話相容性,建議在互斥體名稱前加上「Global」前綴。

在提供的程式碼片段中,定義了一個名為 CreateMutex 的函數,該函數抽象化了 CreateMutexW 功能。您可以使用此函數透過傳遞唯一名稱來建立全域互斥體,例如「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 應用程式可以確保一次僅執行一個實例。如果另一個實例嘗試執行,它將被阻止,直到初始實例終止,從而有效地將可執行檔限制為單一活動實例。

以上是如何確保我的 Go 應用程式只有一個實例在 Windows 上運行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板