go语言实现的一个高效,轻量级的文件锁 gflock

在我们对文件进行操作的时候, 如果你不需要你操作的文件被其他协程访问,则就需要使用一个文件锁来对我们操作的文件进行加锁,今天给大家推荐的这个gflock使用也非常简单:

首先安装依赖: 

go get -u github.com/tekitian/gflock

使用示例 

import "github.com/tekitian/gflock"fileLock := gflock.New("/var/lock/go-lock.lock")locked, err := fileLock.TryLock()if err != nil {// handle locking error
}if locked {// do workfileLock.Unlock()
}

github仓库地址 https://github.com/tekintian/gflock

一个二次封装的文件/文件夹锁使用示例

filelock.go

package internalimport ("fmt""log""os""path/filepath""github.com/tekitian/gflock"
)// FileLock provides a file lock mechanism based on gflock.
type FileLock struct {lock    *gflock.GFlockverbose bool
}// NewFileLock creates a new instance of FileLock.
func NewFileLock(path string, verbose bool) (*FileLock, error) {err := os.MkdirAll(filepath.Dir(path), 0o750)if err != nil {return nil, fmt.Errorf("creating lock file directory: %w", err)}if verbose {log.Printf("Initializing file lock at %s", path)}return &FileLock{lock:    flock.New(path),verbose: verbose,}, nil
}// Release unlocks the file lock.
func (f *FileLock) Release() error {if err := f.lock.Unlock(); err != nil {return fmt.Errorf("releasing file lock at %s: %w", f.lock.Path(), err)}if f.verbose {log.Printf("Lock file %s successfully released", f.lock.Path())}return nil
}// Acquire tries to acquire a file lock.
// It is possible for multiple goroutines within the same process
// to acquire the same lock, so acquireLock is not thread safe in
// that sense, but protects access across different processes.
func (f *FileLock) Acquire() error {ok, err := f.lock.TryLock()if err != nil {return fmt.Errorf("acquiring file lock at %s: %w", f.lock.Path(), err)}if !ok {return fmt.Errorf("lock %s already acquired by another process", f.lock.Path())}if f.verbose {log.Printf("Acquired lock file at %s", f.lock.Path())}return nil
}

测试用例

需要安装增强测试包 got get github.com/stretchr/testify

filelock_test.go

package internalimport ("path/filepath""testing""github.com/stretchr/testify/require"
)// TestAcquireFileLock tests that a lock can be acquired multile times
// within a same process.
func TestAcquireFileLock(t *testing.T) {tempDir := t.TempDir()fl, err := NewFileLock(filepath.Join(tempDir, ".myapp.lock"), false)require.NoError(t, err)defer func() {err := fl.Release()require.NoError(t, err)}()// acquire lockerr = fl.Acquire()require.NoError(t, err)require.True(t, fl.lock.Locked())// acquiring lock a second time within the same process// should succeederr = fl.Acquire()require.NoError(t, err)require.True(t, fl.lock.Locked())// release lockerr = fl.Release()require.NoError(t, err)require.False(t, fl.lock.Locked())// acquire a released lockerr = fl.Acquire()require.NoError(t, err)require.True(t, fl.lock.Locked())
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/19732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sectigo EV代码签名证书费用是多少?

随着数字化时代的到来,软件开发者和企业面临着日益严峻的安全挑战。为了确保他们的软件产品免受恶意篡改和仿冒的威胁,代码签名证书应运而生,成为了业界广泛认可的安全解决方案。在众多代码签名证书提供商中,Sectigo以其卓越的信誉…

整理GTX收发器示例工程(高速收发器十一)

前文分析了xilinx官方提供的GTX IP示例工程,该代码的结构比较混乱,本文将该代码进行梳理,形成一个便于使用的模块,后续如果要使用多通道的收发器,多次例化某个模块就行了。 下图是官方例程中GTX IP相关模块的RTL视图&a…

停车场车位引导系统方案升级实施步骤流程是什么,有什么注意事项

停车场车位引导系统是一种现代化的停车管理系统,它通过实时监测车位占用情况,并向驾驶员提供准确的空闲车位导航信息,从而提高停车场的使用效率和用户体验。随着城市交通的快速发展和车辆数量的不断增加,停车场车位引导系统已成为…

薄膜沉积的均匀性怎么计算?

知识星球(星球名:芯片制造与封测技术社区,星球号:63559049)里的学员问:经常听带我的工程师说膜层的均匀性不好,均匀性是怎么计算的? 什么是薄膜沉积的均匀性?薄膜均匀性指的是薄膜…

Leetcode刷题笔记7

69. x 的平方根 69. x 的平方根 - 力扣(LeetCode) 假设求17的平方根 解法一:暴力解法 从1开始依次尝试 比如1的平方是1,2的平方是4...直到5的平方,25>17,所以一定是4点几的平方,所以等于4…

WSL2-Ubuntu22.04-配置

WSL2-Ubuntu22.04-配置 准备1. WSL相关命令[^1]2. WSL2-Ubuntu22.04可视化3. WSL2 设置 CUDA4. 设置OpenGL 本文介绍了WSL2的基本使用方法及可视化,着重介绍了GPU和OpenGL的设置。 准备 名称版本windows11wsl2CUDA12.5 1. WSL相关命令1 查看已安装的wsl distribut…

官方小游戏项目

一 项目原理:看广告,操作简单,时间自由,适合利用业余时间来做,一个广告大概在15s-30s之间。 二 介绍:给你开代理权限,你就有独立后台管理系统,监测每台手机每条广告的情况&#xff0…

MySQL数据表的“增删查改“

我们学习数据库, 最重要的就是要学会对数据表表进行"增删查改"(CRUD).(C -- create, R -- retrieve, U -- update, D -- delete) 目录 一. "增"(create) 1. 普通新增 2. 指定列新增 3. 一次插入多行 4. 用insert插入时间 5. 小结 二. "查"…

AI科技,赋能企业财务管理

AI技术已深入千行百业,其实际任务解决能力愈发凸显和强劲。正如乔布斯所强调“技术不是为工程师而生,而是为应用而生”。 胜意科技深度集成业内领先技术,将AI融入到实际的财务工作流中,与OCR、RPA等智能技术组合式输出&#xff0c…

Qt-qrencode生成二维码

Qt-qrencode开发-生成二维码📀 文章目录 Qt-qrencode开发-生成二维码📀[toc]1、概述📸2、实现效果💽3、编译qrencode🔍4、在QT中引入编译为静态库的QRencode5、在Qt中直接使用QRencode源码6、在Qt中使用QRencode生成二…

Electron下载插件 or 固件至本地

最近有个特殊需求,由于路由器PCB板子是办公类型,无线传输类型,在特定情况下没有网络支持。则桌面应用程序里面的远程升级路由器功能无法使用,则就需要将OTA升级降至本地通过局域网的HTTP请求去实现。 1.下载代码 Downloads(url){…

BCC编程入门:揭开复杂面纱,探索编程之美

BCC编程入门:揭开复杂面纱,探索编程之美 BCC编程,对于初学者来说,仿佛是一个充满神秘与困惑的迷宫。然而,只要我们勇敢地踏入这片领域,逐步探索,便能够发现其中的奥秘与乐趣。本文将从四个方面…

Django Celery技术详解

文章目录 简介安装和配置创建并调度任务启动Celery Worker在视图中调用异步任务拓展功能 简介 Django Celery 是一个为Django应用程序提供异步任务处理能力的强大工具。它通过与消息代理(如RabbitMQ、Redis)集成,可以轻松地处理需要长时间运…

接口用例设计

设计接口用例的目的是为了提升工作效率,防止遗漏 并且能够通过用例,来实施测试监控 设计思路 功能 单个接口测试 接口业务场景测试(过接口组合测试) 性能 响应时间 吞吐量 服务器资源使用率 错误率 并发数 安全 敏感信息是…

LAMP分布式安全方案搭建网页 (LinuxCentOS7+Apache+Mariadb+PHP)包括服务端口及防火墙规则配置

目录 一、实验目的 二、设计方案及规划 三、实验内容及步骤 (1)实验前基础配置 (2)Test配置,安装Firefox浏览器和图形界面 (3)Web安装Apache (4)Database安装Mari…

微服务架构-微服务架构的挑战与微服务化的具体时机

目录 一、微服务架构的挑战 1.1 概述 1.2 服务拆分 1.3 开发挑战 1.4 测试挑战 1.4.1 开箱即用、一键部署的集成环境 1.4.2 测试场景和测试确定性 1.4.3 微服务相关的非功能测试 1.4.4 自动化测试 1.5 运维挑战 1.5.1 监控 1.5.2 部署 1.5.3 问题追查 1.5.4 依赖管…

高等教育的AI革新:OpenAI面向大学推出ChatGPT Edu

OpenAI推出了ChatGPT Edu,这是一个为大学设计的专用版本,旨在让学生、教职员工、研究人员和校园运营能够负责任地使用AI。 ChatGPT Edu 将AI技术引入了教育领域,其建立在GPT-4o的基础上,它不仅能够处理文本和图像,还…

【线性代数】【一】1. 1 线性方程组与线性组合

文章目录 前言一、线性方程组的求解1.1 直线的交点1.2 向量的加权求和 二、线性组合的表示范围三、线性方程组的解的分析总结 前言 有段时间没更新了,准备开个新坑,写点数学基础相关的内容,计划先过一遍线性代数,再扩展到矩阵论&…

更改 Docker 的默认存储位置

记录一下使用 Docker 遇到的问题,Docker 也用得比较多,最近发现根目录所在磁盘快满了,发现是 Docker 默认会将镜像和容器等数据保存在目录 /var/lib/docker 目录下,我们可以更改 Docker 的默认存储位置,比如改到数据盘…

【机器学习】深入探索机器学习:线性回归算法的原理与应用

❀线性回归算法 📒1. 引言📒2. 线性回归的基本原理🎉回归方程🎉最小化误差🎉线性回归的假设条件 📒3. 线性回归算法的实现📒4. 线性回归算法的特征工程📒5. 线性回归模型评估与优化&…