我正在写一个Python 2.7
脚本。
总之,这个脚本每晚都在运行Linux
并激活几个进程。
我想确保此脚本不会并行运行多次(基本上是在尝试模仿Singleton
模式,但在应用程序级别)。
代码示例
def main():
# before doing anything, I'd like to know whether this
# script was activated and alive.
# if so, error out
# do something
if __name__ == "__main__":
main()
建议
天真的解决方案是创建某种锁定文件,充当互斥锁。
我们要做的第一件事就是检查这个文件是否存在。如果是这样,那么脚本的其他实例已经创建了它,我们应该出错。脚本完成后,我们删除此文件。
我假设这个解决方案可以工作,只要文件系统上的操作是原子的。
执行
import os, sys
lock_file_path = ".lock_script"
def lock_mutex():
if os.path.exists(lock_mutex_path):
print "Error: script was already activated."
sys.exit(-1)
else:
file = open(lock_mutex_path, 'w')
def unlock_mutex():
assert( os.path.exists(lock_mutex_path))
os.remove(lock_mutex_path)
def main():
try:
lock_mutex()
# do something
unlock_mutex()
except:
unlock_mutex()
if __name__ == "__main__":
main()
问题
如何保证lock_mutex()
和unlock_mutex()
是原子的?