Linux IPC:锁定,但不是基于文件的锁定

Linux IPC: Locking, but not file based locking

我需要一种方法来确保只有一个 python 进程在处理一个目录。

lock/semaphore 应该是机器本地的(linux 操作系统)。

不涉及网络或 NFS。

我想避免基于文件的锁,因为我不知道我应该把锁文件放在哪里。

pypi 上有提供 posix IPC 的库。

有没有办法在没有第三方库的情况下将 linux 信号量与 python 一起使用?

multiprocessing.Lock 提供的锁没有帮助,因为两个 python 解释器不共享同一个父项。

不涉及线程。所有进程只有一个线程。

我在 linux 上使用 Python 2.7。

如何在 linux 上同步两个 python 脚本(没有基于文件的锁定)?

必需的功能:如果一个进程终止,那么 lock/semaphore 应该被操作系统释放。

I would like to avoid file based locks, since I don't know where I should put the lock file.

您可以锁定现有文件或目录(正在处理的文件或目录)。

Required feature: If one process dies, then the lock/semaphore should get released by the operating system.

这正是文件锁的工作原理。

flock 目录本身——那么你永远不需要担心把锁文件放在哪里:

import errno
import fcntl
import os
import sys

# This will work on Linux

dirfd = os.open(THE_DIRECTORY, os.O_RDONLY)         # FIXME: FD_CLOEXEC
try:
  fcntl.flock(dirfd, fcntl.LOCK_EX|fcntl.LOCK_NB)
except IOError as ex:
  if ex.errno != errno.EAGAIN:
    raise
  print "Somebody else is working here; quitting."  # FIXME: logging
  sys.exit(1)

do_the_work()
os.close(dirfd)