Home Backend Development Golang How to implement file lock in golang

How to implement file lock in golang

Dec 19, 2022 am 11:03 AM
golang go language

In golang, you can use the API of the sync package to implement file locking. File lock (flock) is an advisory lock for the entire file; that is, if a process places a lock on a file (inode), other processes can know it (advisory locks do not force processes to comply); file locks The calling syntax is "syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)".

How to implement file lock in golang

The operating environment of this tutorial: Windows 7 system, GO version 1.18, Dell G3 computer.

When we use Go language to develop some programs, multiple processes often operate on the same file at the same time, which can easily lead to confusion of the data in the file. At this time, we need to use some means to balance these conflicts, and file lock (flock) came into being. Let's introduce it below.

For flock, the most common example is Nginx. After the process runs, the current PID will be written to this file. Of course, if this file already exists, that is, the previous process has not exited, then Nginx It will not restart, so flock can also be used to detect whether the process exists.

flock is an advisory lock for the entire file. In other words, if a process places a lock on a file (inode), other processes can know it (advisory locks do not force processes to comply). The best part is that its first parameter is a file descriptor, and when this file descriptor is closed, the lock is automatically released. When the process terminates, all file descriptors will be closed. So often there is no need to consider things like unlocking atomic locks.

Before introducing it in detail, let’s introduce the code first

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)
}
Copy after login

When running the above code under Windows system, the following error will appear:

How to implement file lock in golang

This is because Windows systems do not support pid locks, so we need to run the above program normally under Linux or Mac systems.

The above code demonstrates starting 10 goroutines at the same time, but during the running of the program, only one goroutine can obtain the file lock (flock). Other goroutinue will throw exception information after failing to obtain flock. This can achieve the effect of allowing only one process to access the same file within a specified period.

The specific call of the file lock in the code:

syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
Copy after login

We use syscall.LOCK_EX, syscall.LOCK_NB, what does this mean?

flock is a advisory lock and is not mandatory. One process uses flock to lock the file, and the other process can directly operate the file being locked and modify the data in the file. The reason is that flock is only used to detect whether the file is locked. If the file is already locked, another process In the case of writing data, the kernel will not block the write operation of this process, which is the kernel processing strategy of advisory locks.

flock has three main operation types:

  • LOCK_SH: Shared lock, multiple processes can use the same lock, often used as a read shared lock;

  • LOCK_EX: Exclusive lock, only allowed to be used by one process at the same time, often used as a write lock;

  • LOCK_UN: Release the lock.

When a process uses flock to try to lock a file, if the file is already locked by another process, the process will be blocked until the lock is released, or the LOCK_NB parameter is used when calling flock. When trying to lock the file, it is found that it has been locked by another service, and an error will be returned with the error code EWOULDBLOCK.

Flock lock release is very unique. You can call the LOCK_UN parameter to release the file lock, or you can release the file lock by closing fd (the first parameter of flock is fd), which means flock will It is automatically released when the process is closed.

For more programming related knowledge, please visit: Programming Video! !

The above is the detailed content of How to implement file lock in golang. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to safely read and write files using Golang? How to safely read and write files using Golang? Jun 06, 2024 pm 05:14 PM

Reading and writing files safely in Go is crucial. Guidelines include: Checking file permissions Closing files using defer Validating file paths Using context timeouts Following these guidelines ensures the security of your data and the robustness of your application.

How to configure connection pool for Golang database connection? How to configure connection pool for Golang database connection? Jun 06, 2024 am 11:21 AM

How to configure connection pooling for Go database connections? Use the DB type in the database/sql package to create a database connection; set MaxOpenConns to control the maximum number of concurrent connections; set MaxIdleConns to set the maximum number of idle connections; set ConnMaxLifetime to control the maximum life cycle of the connection.

Similarities and Differences between Golang and C++ Similarities and Differences between Golang and C++ Jun 05, 2024 pm 06:12 PM

Golang and C++ are garbage collected and manual memory management programming languages ​​respectively, with different syntax and type systems. Golang implements concurrent programming through Goroutine, and C++ implements it through threads. Golang memory management is simple, and C++ has stronger performance. In practical cases, Golang code is simpler and C++ has obvious performance advantages.

How steep is the learning curve of golang framework architecture? How steep is the learning curve of golang framework architecture? Jun 05, 2024 pm 06:59 PM

The learning curve of the Go framework architecture depends on familiarity with the Go language and back-end development and the complexity of the chosen framework: a good understanding of the basics of the Go language. It helps to have backend development experience. Frameworks that differ in complexity lead to differences in learning curves.

How to generate random elements from list in Golang? How to generate random elements from list in Golang? Jun 05, 2024 pm 04:28 PM

How to generate random elements of a list in Golang: use rand.Intn(len(list)) to generate a random integer within the length range of the list; use the integer as an index to get the corresponding element from the list.

Comparison of advantages and disadvantages of golang framework Comparison of advantages and disadvantages of golang framework Jun 05, 2024 pm 09:32 PM

The Go framework stands out due to its high performance and concurrency advantages, but it also has some disadvantages, such as being relatively new, having a small developer ecosystem, and lacking some features. Additionally, rapid changes and learning curves can vary from framework to framework. The Gin framework is a popular choice for building RESTful APIs due to its efficient routing, built-in JSON support, and powerful error handling.

What are the best practices for error handling in Golang framework? What are the best practices for error handling in Golang framework? Jun 05, 2024 pm 10:39 PM

Best practices: Create custom errors using well-defined error types (errors package) Provide more details Log errors appropriately Propagate errors correctly and avoid hiding or suppressing Wrap errors as needed to add context

What are the advantages of golang framework? What are the advantages of golang framework? Jun 06, 2024 am 10:26 AM

Advantages of the Golang Framework Golang is a high-performance, concurrent programming language that is particularly suitable for microservices and distributed systems. The Golang framework makes developing these applications easier by providing a set of ready-made components and tools. Here are some of the key advantages of the Golang framework: 1. High performance and concurrency: Golang itself is known for its high performance and concurrency. It uses goroutines, a lightweight threading mechanism that allows concurrent execution of code, thereby improving application throughput and responsiveness. 2. Modularity and reusability: Golang framework encourages modularity and reusable code. By breaking the application into independent modules, you can easily maintain and update the code

See all articles