调用fcntl.lockf()的管道(“按位或”)

时间:2019-01-23 16:01:42

标签: python python-3.x flock fcntl lockfile

This answer包含以下行:

fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)

管道在Python中是"bitwise OR"

我检查了fcntl.lockf(fd, cmd, len=0, start=0, whence=0)的Python文档,并说cmd是以下之一:

  

LOCK_UN –解锁

     

LOCK_SH –获取共享锁

     

LOCK_EX –获取排他锁

还一直在阅读这些变量here

有人知道该行及其作用吗?如果仅使用一个参数且不使用管道符号,该行是否起作用?

在Python文档中甚至都没有提到LOCK_NB。

1 个答案:

答案 0 :(得分:2)

这些名称是数字常量,每个都是2的幂。这意味着它们是带有单个位设置的整数。

您可以将这些数字与|结合使用,以产生一个设置了多个位的整数,每个位代表一个特定的选项:

>>> import fcntl
>>> fcntl.LOCK_SH  # bit 1 set
1
>>> fcntl.LOCK_EX  # bit 2 set
2
>>> fcntl.LOCK_NB  # bit 3 set
4
>>> fcntl.LOCK_UN  # bit 4 set
8
>>> fcntl.LOCK_SH | fcntl.LOCK_UN  # combine bits 1 and 4
9
>>> format(fcntl.LOCK_SH | fcntl.LOCK_UN, '04b')
'1001'

这是在系统调用中传递设置配置的非常常用的方法。 fctnl.lock()就是这样的一个例子,但是还有更多的地方使用相同的技术。 os.open() call是另一个示例,re module flags也是如此。

重要的是要意识到它们是正义整数。无需使用fcntl.LOCK_EX | fcntl.LOCK_NB设置标志(设置位2和3),您只需传递6

fcntl.lockf(fp, 6)

lockf()函数而言,没有区别。使用命名常量的要点是,使用这些常量可以生成自记录代码