我们正在并行运行许多詹金斯项目。我们使用python,并且我们选择使用pyenv来管理虚拟环境。不幸的是,pyenv有一个众所周知的race condition。为了解决这个问题,我想在流程级别实现锁定。我想做的是:

lock some resource (a file?)
do my pyenv stuff
unlock the resource

我的剧本是用bash写的。如何在bash中实现资源锁定/解锁?

最佳答案

因此,在unix世界中,当需要跨进程锁时,您的朋友是一个名为flock的命令。它是作为操作系统级别的原子操作实现的,对于这类事情非常有用。你可以阅读more about it here。以下是使用方法:

  # Wait for lock on  (fd 222) for 10 seconds
  (flock -w 10 222 || exit 1

  {
      # Do the operations you want to here
  }) 222>/path/to/lockfile

这里有几个技巧。首先,通常在使用输出重定向时,bash会在尝试flock之前先打开一个文件。不过,在这里,因为我们有()bash将首先启动一个子shell,它的第一个命令是flock。flock将尝试获取文件句柄222上的锁。Flock将锁定文件描述符。锁定文件描述符后,将运行{}中的代码。在运行之后,文件描述符222的内容被写入锁文件(即,没有),文件被关闭并且锁被释放。这就像关闭文件释放锁的C一样。当然,没有比著名的CharlesDuffy(hat tip@codeforester)更好的解释了这一点,他解释了发生了什么。

关于python - 如何在多进程系统中实现锁定?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41275785/

10-15 12:58