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。
答案 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()
函数而言,没有区别。使用命名常量的要点是,使用这些常量可以生成自记录代码。