我有一个关于flock()如何工作的问题,特别是在python中。我有一个模块可以打开串行连接(通过os.open())。我需要保证这个线程的安全。当使用threading.Lock()在同一模块中工作时,使其线程安全很容易,但是如果模块从不同的地方导入,它就会崩溃。
我正在考虑使用flock(),但我很难找到关于flock确切工作原理的足够信息。我读到flock()在文件关闭后解锁文件。但是有没有一种情况可以在python崩溃的情况下保持文件打开呢?
如果设置了LOCK_EX,那么到底允许什么来使用锁定的文件?仅仅是锁定文件的模块?从最初运行的脚本导入的任何模块?
发布于 2010-10-13 04:01:35
当一个进程终止时,操作系统应该清理所有打开的文件资源(我敢肯定,有一些警告)。这是因为建议锁在文件关闭时释放,该操作在python进程退出时作为操作系统清理的一部分发生。
请记住,flock(2)仅仅是建议:
建议锁允许协作的进程对文件执行一致的操作,但其他表现不佳的进程仍然可以在不使用建议锁的情况下访问这些文件。
flock(2)实现了读取器-写入器锁。您不能使用LOCK_EX将同一文件聚集两次,但是可以使用LOCK_SH同时聚集任何数量的人(只要没有其他人在它上面有LOCK_EX )。
锁定机制允许两种类型的锁:共享锁和排他锁。任何时候都可以对一个文件应用多个共享锁,但任何时候都不允许对一个文件同时应用多个独占锁,或者同时使用共享锁和独占锁。
flock在操作系统/进程级别工作,独立于python模块。一个模块可以请求n个锁,或者可以跨m个模块请求n个锁。但是,在给定时间,只有一个进程可以持有给定文件上的LOCK_EX锁。
“非UNIX”系统或非本地文件系统上的YMMV。
https://stackoverflow.com/questions/3918385
复制相似问题