文件上下文管理器中的fcntl.lockf

时间:2019-06-18 22:55:26

标签: python python-3.x multiprocessing

我有一段代码(python 3.7)如下:

import os, fcntl

with open("testfile", 'w') as tf:
    fcntl.lockf(tf.fileno(), fcntl.LOCK_EX | fcntl.lock_NB)
    ... some code that does some stuff ...
    tf.write("%s got here first!!" % (os.getpid())
    fcntl.lockf(tf.fileno(), fcntl.LOCK_UN)

对于ioopen(内置函数)中的documentation,IOBase还是一个上下文管理器,可确保在with语句后关闭文件。套件完成,即使发生异常。

现在,假设我们有两个运行该代码的进程(不是线程)p1,p2。

p1首先到达那里,并且对该文件具有排他锁,因此p2抛出了IOError。在这种情况下,我有三个问题:

  1. p2将在第一个fcntl.lockf之后执行代码,还是只退出with语句的代码块并调用文件对象的__exit__方法?
  2. 如果ans to 1为YES,则在p1的上下文管理器之后执行p2的上下文管理器时,p2是否将文件清空?这里没有比赛条件的可能性吗?有时p1可能会赢得并冲洗+关闭p2之前的流,有时p2会在p1之前关闭。谁最后刷新并关闭该文件,谁都会在文件中包含其内容。我的分析正确吗?
  3. 由于我以open模式'w'来访问文件,因此当p1和p2在其内存中创建文件对象时,文件都会被p1和p2截断。我希望仅在进程首先进入文件时才会发生这种情况?我找不到办法 首先以'w'模式独占打开文件,然后将其锁定。

谢谢!

0 个答案:

没有答案