1

此答案包含以下行:

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

管道在 Python 中是“按位或”

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

LOCK_UN – 解锁

LOCK_SH – 获取共享锁

LOCK_EX – 获取排他锁

还在这里阅读了这些变量

有谁了解那条线及其作用,以及它是否只使用一个参数而没有管道符号?

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

4

1 回答 1

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()调用是另一个示例,re模块标志也是如此。

重要的是要意识到这些只是整数。除了使用fcntl.LOCK_EX | fcntl.LOCK_NB(设置位 2 和 3)设置标志外,您还可以传入6

fcntl.lockf(fp, 6)

lockf()功能而言,没有区别。使用命名常量的意义在于,使用它们可以生成自文档化代码

于 2019-01-23T16:03:48.713 回答