python - 与flock()函数有关的问题

标签 python locking fcntl flock

我有一个关于flock()如何工作的问题,特别是在Python中。我有一个打开串行连接的模块(通过 os.open() )。我需要确保这个线程的安全。使用 threading.Lock() 在同一个模块中工作时,很容易使其线程安全,但如果模块从不同的位置导入,则会中断。

我正在考虑使用flock(),但是我很难找到足够的关于flock到底如何工作的信息。我读到,一旦文件关闭,flock()就会解锁文件。但是,如果 python 崩溃,是否存在使文件保持打开状态的情况?

如果设置了LOCK_EX,那么究竟允许什么使用锁定的文件?只是锁定文件的模块?从最初运行的脚本导入的任何模块?

最佳答案

当进程终止时,操作系统应该清理所有打开的文件资源(我确信有一些警告)。这是因为关闭文件时会释放咨询锁,该操作是 python 进程退出时操作系统清理的一部分。

记住,flock(2)仅供引用:

Advisory locks allow cooperating processes to perform consistent operations on files, but [other, poorly behaved] processes may still access those files without using advisory locks.

flock(2)实现读写锁。您无法使用 LOCK_EX 对同一个文件进行两次集群,但任意数量的人都可以同时使用 LOCK_SH 对同一文件进行集群(只要没有其他人拥有 LOCK_EX 就可以了)。

The locking mechanism allows two types of locks: shared locks and exclusive locks. At any time multiple shared locks may be applied to a file, but at no time are multiple exclusive, or both shared and exclusive, locks allowed simultaneously on a file.

flock 在操作系统/进程级别工作,独立于 python 模块。一个模块可能请求 n 个锁,或者跨 m 个模块请求 n 个锁。但是,在给定时间只有一个进程可以对给定文件持有 LOCK_EX 锁。

“非 UNIX”系统或非本地文件系统上的 YMMV。

关于python - 与flock()函数有关的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3918385/

相关文章:

python - DataFrame 一维错误上的 Pandas 交叉表

c# - C# 中使用 Parallel.For 进行锁定的意外行为

c++ - 如何使用 header fcntl.h 和 unistd.h 从文件中读取和写入?

c - O_NONBLOCK 是否被设置为文件描述符或基础文件的属性?

python - 绘制散点图时的问题

python - 查找总和为给定数字的所有可能子集

python - 如何将 OCO 订单发送到币安

MySQL InnoDB 事务 + 锁定

c++ - 为自定义库实现 lock_guard 的正确 C++ 方法

linux - 文件写锁和子进程