pipe ("побитовое ИЛИ") в вызове fcntl.lockf()
Этот ответ содержит следующую строку:
fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
Труба, в Python, является "побитовым ИЛИ"
Я проверил документы Python для fcntl.lockf(fd, cmd, len=0, start=0, откуда =0), и он говорит, что cmd является одним из:
LOCK_UN - разблокировать
LOCK_SH - получить общую блокировку
LOCK_EX - приобрести эксклюзивный замок
Также читал об этих переменных здесь
Кто-нибудь понимает эту строку и что она делает, и если она будет работать только с одним аргументом и без символа канала?
LOCK_NB даже не упоминается в документации по Python.
1 ответ
Эти имена являются числовыми константами, каждая из которых имеет степень 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()
функция обеспокоена. Смысл использования именованных констант заключается в том, что их использование позволяет самодокументировать код.