Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Linux IPC:锁定,但不是基于文件的锁定_Python_Linux_Ipc_Python Multiprocessing - Fatal编程技术网

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

Python Linux IPC:锁定,但不是基于文件的锁定,python,linux,ipc,python-multiprocessing,Python,Linux,Ipc,Python Multiprocessing,我需要一种方法来确保只有一个python进程在处理一个目录 锁/信号量应该是机器本地的(linux操作系统) 不涉及网络或NFS 我希望避免使用基于文件的锁,因为我不知道应该将锁文件放在哪里 在pypi上有提供posix IPC的库 在没有第三方库的情况下,是否无法将linux信号量与python一起使用 由multiprocessing.lock提供的锁没有帮助,因为两个python解释器不共享同一个父级 不涉及线程。所有进程只有一个线程 我正在linux上使用Python 2.7 如何在li

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

锁/信号量应该是机器本地的(linux操作系统)

不涉及网络或NFS

我希望避免使用基于文件的锁,因为我不知道应该将锁文件放在哪里

在pypi上有提供posix IPC的库

在没有第三方库的情况下,是否无法将linux信号量与python一起使用

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

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

我正在linux上使用Python 2.7

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

必需的特性:如果一个进程死亡,那么操作系统应该释放锁/信号量

我希望避免使用基于文件的锁,因为我不知道应该将锁文件放在哪里

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

必需的特性:如果一个进程死亡,那么操作系统应该释放锁/信号量

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

将目录本身聚集起来,这样您就不必担心锁文件放在哪里:

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)

这可能有助于创建原子目录,因此您可以尝试创建一个名为
的隐藏目录,除非您通过删除它来解除锁定,否则其他任何人都无法成功…@MarkSetchell我正在搜索编程语言python的解决方案。@MarkSetchell创建目录不是一个解决方案。我更新了问题:必需的特性:如果一个进程死亡,那么锁/信号应该由操作系统释放。好的,这一次有效,因为在这种情况下我有一个目录。我很好奇。。。没有目录就无法进行锁定吗?