在golang中,可以利用sync套件的api來實作檔案鎖定。文件鎖(flock)是對於整個文件的建議性鎖;也就是說,如果一個進程在一個文件(inode)上放了鎖,其它進程是可以知道的(建議性鎖不強求進程遵守);文件鎖的呼叫語法「syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)」。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
我們使用Go語言開發一些程式的時候,往往出現多個行程同時操作同一份文件的情況,這很容易導致文件中的資料混亂。這時我們就需要採取一些手段來平衡這些衝突,文件鎖(flock)應運而生,下面我們就來介紹一下。
對於flock,最常見的例子就是Nginx,進程運行起來後就會把當前的PID 寫入這個文件,當然如果這個文件已經存在了,也就是前一個進程還沒有退出,那麼Nginx就不會重新啟動,所以flock 還可以用來偵測進程是否存在。
flock 是整個檔案的建議性鎖定。也就是說,如果一個進程在一個檔案(inode)上放了鎖,其它進程是可以知道的(建議性鎖不強求進程遵守)。最棒的一點是,它的第一個參數是檔案描述符,在此檔案描述符關閉時,鎖定會自動釋放。而當進程終止時,所有的檔案描述符都會關閉。所以很多時候就不用考慮類似原子鎖解鎖的事情。
在具體介紹前,先上程式碼
package main import ( "fmt" "os" "sync" "syscall" "time" ) //文件锁 type FileLock struct { dir string f *os.File } func New(dir string) *FileLock { return &FileLock{ dir: dir, } } //加锁 func (l *FileLock) Lock() error { f, err := os.Open(l.dir) if err != nil { return err } l.f = f err = syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB) if err != nil { return fmt.Errorf("cannot flock directory %s - %s", l.dir, err) } return nil } //释放锁 func (l *FileLock) Unlock() error { defer l.f.Close() return syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN) } func main() { test_file_path, _ := os.Getwd() locked_file := test_file_path wg := sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go func(num int) { flock := New(locked_file) err := flock.Lock() if err != nil { wg.Done() fmt.Println(err.Error()) return } fmt.Printf("output : %d\n", num) wg.Done() }(i) } wg.Wait() time.Sleep(2 * time.Second) }
在Windows 系統下執行上面的程式碼會出現下面的錯誤:
syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)我們採用了 syscall.LOCK_EX、syscall.LOCK_NB,這是什麼意思呢? flock 屬於建議性鎖,不具備強制性。一個進程使用flock 將文件鎖住,另一個進程可以直接操作正在被鎖的文件,修改文件中的數據,原因在於flock 只是用來檢測文件是否被加鎖,針對文件已經被加鎖,另一個進程寫入資料的情況,核心不會阻止這個行程的寫入操作,也就是建議性鎖的核心處理策略。 flock 主要三種操作類型:
- LOCK_SH:共享鎖,多個程序可以使用相同把鎖,常被用作讀取共享鎖;
- LOCK_EX:排他鎖,同時只允許一個行程使用,常被用來當作寫鎖; ##LOCK_UN:釋放鎖。
- 程式使用 flock 嘗試鎖定檔案時,如果檔案已經被其他進程鎖住,則行程會被阻塞直到鎖被釋放掉,或是在呼叫 flock 的時候,採用 LOCK_NB 參數。在嘗試鎖住該文件的時候,發現已經被其他服務鎖住,會回傳錯誤,錯誤碼為 EWOULDBLOCK。
flock 鎖的釋放非常具有特色,即可呼叫LOCK_UN 參數來釋放檔案鎖,也可以透過關閉fd 的方式來釋放檔案鎖(flock 的第一個參數是fd),表示flock 會隨著進程的關閉而自動釋放掉。
更多程式相關知識,請造訪:
程式設計影片以上是golang怎麼實作文件鎖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

golangisidealforperformance-Critical-clitageAppations and ConcurrentPrompromming,而毛皮刺激性,快速播種和可及性。 1)forhigh-porformanceneeds,pelectgolangduetoitsefefsefefseffifeficefsefeflicefsiveficefsiveandconcurrencyfeatures.2)fordataa-fordataa-fordata-fordata-driventriventriventriventriventrivendissp pynonnononesp

Golang通過goroutine和channel實現高效並發:1.goroutine是輕量級線程,使用go關鍵字啟動;2.channel用於goroutine間安全通信,避免競態條件;3.使用示例展示了基本和高級用法;4.常見錯誤包括死鎖和數據競爭,可用gorun-race檢測;5.性能優化建議減少channel使用,合理設置goroutine數量,使用sync.Pool管理內存。

Golang更適合系統編程和高並發應用,Python更適合數據科學和快速開發。 1)Golang由Google開發,靜態類型,強調簡潔性和高效性,適合高並發場景。 2)Python由GuidovanRossum創造,動態類型,語法簡潔,應用廣泛,適合初學者和數據處理。

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

Go語言在並發編程、性能、學習曲線等方面有獨特優勢:1.並發編程通過goroutine和channel實現,輕量高效。 2.編譯速度快,運行性能接近C語言。 3.語法簡潔,學習曲線平緩,生態系統豐富。

Golang和Python的主要區別在於並發模型、類型系統、性能和執行速度。 1.Golang使用CSP模型,適用於高並發任務;Python依賴多線程和GIL,適合I/O密集型任務。 2.Golang是靜態類型,Python是動態類型。 3.Golang編譯型語言執行速度快,Python解釋型語言開發速度快。

Golang通常比C 慢,但Golang在並發編程和開發效率上更具優勢:1)Golang的垃圾回收和並發模型使其在高並發場景下表現出色;2)C 通過手動內存管理和硬件優化獲得更高性能,但開發複雜度較高。

Golang在雲計算和DevOps中的應用廣泛,其優勢在於簡單性、高效性和並發編程能力。 1)在雲計算中,Golang通過goroutine和channel機制高效處理並發請求。 2)在DevOps中,Golang的快速編譯和跨平台特性使其成為自動化工具的首選。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

Dreamweaver CS6
視覺化網頁開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版
中文版,非常好用