Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python的fcntl.flock函数是否提供文件访问的线程级锁定?_Python_Linux_Multithreading_Locking_Flock - Fatal编程技术网

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

python的fcntl.flock函数是否提供文件访问的线程级锁定?,python,linux,multithreading,locking,flock,Python,Linux,Multithreading,Locking,Flock,Python的fcnt模块提供了一个名为[flock][1]的方法来验证文件锁定。描述如下: 对文件执行锁定操作 描述符fd文件对象提供 fileno方法被接受为 好请参阅Unix手册2 详情请参阅。在某些系统上,这 使用fcntl模拟函数 查找flock的linux手册页时,它只涉及跨进程锁定,例如: 如果出现以下情况,对flock的呼叫可能会被阻止: 不兼容的锁由另一个用户持有 过程进行非阻塞 请求,包括通过ORing锁定 使用上述任何一种操作 所以我的问题是:flock是否也会提供线程安全

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

对文件执行锁定操作 描述符fd文件对象提供 fileno方法被接受为 好请参阅Unix手册2 详情请参阅。在某些系统上,这 使用fcntl模拟函数

查找flock的linux手册页时,它只涉及跨进程锁定,例如:

如果出现以下情况,对flock的呼叫可能会被阻止: 不兼容的锁由另一个用户持有 过程进行非阻塞 请求,包括通过ORing锁定 使用上述任何一种操作

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

[1] :是使用fcntl模拟的。

群集锁不关心线程事实上,它们也不关心进程。如果在通过fork继承的两个进程中使用相同的文件描述符,则使用该FD锁定文件的任一进程都将获得两个进程的锁。换句话说,在下面的代码中,两个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)
同样,如果您锁定同一个文件两次,但使用不同的文件描述符,则无论您处于同一进程还是同一线程中,锁都会相互阻止。请参阅flock2:如果进程使用open2或类似工具为同一文件获取多个描述符,flock将独立处理这些描述符。使用这些文件描述符之一锁定文件的尝试可能会被调用进程已通过另一个描述符放置的锁拒绝

请记住,对于Linux内核来说,进程和线程本质上是相同的,内核级API通常对它们进行相同的处理。在大多数情况下,如果系统调用记录了进程间的子/父行为,那么线程也是如此


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

您是说要正确使用锁,您需要在每个上下文中获得不同的文件描述符吗?