写点什么

如何锁住文件 | python 小知识

作者:AIWeker
  • 2023-04-15
    福建
  • 本文字数:907 字

    阅读完需:约 3 分钟

1. 什么是锁

在程序开发中,当所需资源遭到争抢的时候,通常用锁来保证数据的一致性。应用场景如如数据库,各个进程需要保证它正在单独地写一个文件,这时就要用到文件锁。


锁的种类通常由互斥锁和共享锁,互斥锁又称为为写锁,同一时刻只能有一个进行获得锁,其他进行则等待;共享锁通常是读锁,需要多个进行获得读锁权限,但不需要有写锁。


锁也可以区分锁的范围,如整个文件锁和局部锁,局部锁如数据库中行锁。


锁之所以能够实现进程的互斥,主要是依靠了系统内核里统一的资源入口控制。

2.python 如何实现锁

在 Linux 中可以使用 fcntl 包里实现锁,锁的类型和操作


  • LOCK_SH:设置共享(读)锁

  • LOCK_EX:设置独占(写)锁

  • LOCK_UN:解锁


我们来看一个简单的例子:


import fcntlimport time
# 打开文件file = open('example.txt', 'w')
# 获取文件锁fcntl.flock(file.fileno(), fcntl.LOCK_EX)
# 写入数据file.write('Hello, World!')time.sleep(5)
# 释放文件锁fcntl.flock(file.fileno(), fcntl.LOCK_UN)
# 关闭文件file.close()
复制代码


fcntl 实现锁的调用很简单,获取锁+操作+解锁。在测试时,我们在执行上面脚本时,获得文件锁后写入文本时,如果还要其他程序向获取文件锁,就会在获取文件锁时进行等待,直到第一个程序释放锁。


另外需要注意的是,在 windows 中没有 fcntl。可以使用 msvcrt 库中的锁定函数来实现文件锁定。


以下是一个使用 msvcrt 库实现文件锁定的示例:


import msvcrtimport os
# 打开文件file_path = "test.txt"file = open(file_path, "r+")
# 获取文件句柄file_handle = msvcrt.get_osfhandle(file.fileno())
# 锁定文件msvcrt.locking(file_handle, msvcrt.LK_LOCK, os.path.getsize(file_path))
# 在文件中写入数据file.write("Hello, World!")
# 解锁文件msvcrt.locking(file_handle, msvcrt.LK_UNLCK, os.path.getsize(file_path))
# 关闭文件file.close()
复制代码

3. 小结

锁可以保证资源冲突时,保证资源数据的一致性,不会出现错乱的情况,现总结如下:


  • 锁有互斥锁和共享锁,互斥锁是独占锁,一次只能一个进程获取;而共享锁可多个进行共同获取锁,但不可是互斥锁

  • 锁的范围可全部也可以局部

  • python 中可以 fcntl 和 msvcrt 实现文件锁

发布于: 刚刚阅读数: 4
用户头像

AIWeker

关注

InfoQ签约作者 / 公众号:人工智能微客 2019-11-21 加入

人工智能微客(aiweker)长期跟踪和分享人工智能前沿技术、应用、领域知识,不定期的发布相关产品和应用,欢迎关注和转发

评论

发布
暂无评论
如何锁住文件 | python小知识_Python_AIWeker_InfoQ写作社区