gpt4 book ai didi

python - python 的 fcntl.flock 函数是否提供文件访问的线程级锁定?

转载 作者:太空狗 更新时间:2023-10-29 11:47:52 26 4
gpt4 key购买 nike

Python 的 fcnt 模块提供了一种名为 [flock][1] 的方法来证明文件锁定。它的描述如下:

Perform the lock operation op on file descriptor fd (file objects providing a fileno() method are accepted as well). See the Unix manual flock(2) for details. (On some systems, this function is emulated using fcntl().)

查了linux man page flock,只提到跨进程锁,例如:

A call to flock() may block if an incompatible lock is held by another process. To make a non-blocking request, include LOCK_NB (by ORing) with any of the above operations.

所以我的问题是:flock() 是否也会提供线程安全锁定并锁定同一进程内的多个线程以及来自不同进程的线程?

[1]: http://docs.python.org/library/fcntl.html#fcntl.flockfunction使用 fcntl() 模拟。)

最佳答案

flock 锁不关心线程——事实上,它们也不关心进程。如果您在两个进程中使用相同的文件描述符(通过 fork 继承),则使用该 FD 锁定文件的任一进程都将为这两个进程获取锁。换句话说,在下面的代码中both flock 调用将返回成功:子进程锁定文件,然后父进程获取相同的锁而不是阻塞,因为他们都是同一个 FD。

import fcntl, time, os

f = open("testfile", "w+")
print "Locking..."
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
print "locked"
fcntl.flock(f.fileno(), fcntl.LOCK_UN)

if os.fork() == 0:
# We're in the child process, and we have an inherited copy of the fd.
# Lock the file.
print "Child process locking..."
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
print "Child process locked..."
time.sleep(1000)
else:
# We're in the parent. Give the child process a moment to lock the file.
time.sleep(0.5)

print "Parent process locking..."
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
print "Parent process locked"
time.sleep(1000)

同理,如果您两次锁定同一个文件,但使用不同的文件描述符,那么这些锁将相互阻塞——无论您是在同一个进程还是同一个线程中。参见 flock(2):如果一个进程使用 open(2)(或类似的)为同一个文件获取多个描述符,这些描述符将由 flock() 独立处理。使用这些文件描述符之一锁定文件的尝试可能会被调用进程已经通过另一个描述符放置的锁拒绝。

请记住,对于 Linux 内核而言,进程和线程本质上是同一回事,并且内核级 API 通常将它们视为相同。在大多数情况下,如果系统调用记录了进程间子/父行为,那么线程也是如此。

当然,您可以(而且可能应该)自己测试这种行为。

关于python - python 的 fcntl.flock 函数是否提供文件访问的线程级锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3899435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com