Python锁文件实现(其中第二种方法是转载的)
来源:互联网 发布:淘宝店什么最好卖 编辑:程序博客网 时间:2024/06/05 06:55
有时候我们需要程序只存在一个运行实例。一般方法就是创建一个锁文件 ,然后运行完成后删除该锁文件 。
import osLOCK_FILE = "/tmp/lockfile.tmp"def hasSelfProcess(): """ 检查本程序是否已经被用户启动了 @return: True: 本程序已经被用户启动 False: 本程序未被用户启动 @rtype: boolean """ try: os.open(LOCK_FILE, os.O_CREAT|os.O_EXCL|os.O_RDWR) except OSError: return True else: return False
在每次运行程序前,调用此方法进行判断,就可知道本程序是否已经有另外一个实例在运行了。
当然运行完了还要再删除临时文件, 这个可以通过Python的自带模块atexit来实现。
import atexit@atexit.registerdef clearLockFile(): if osp.isfile(LOCK_FILE): try: os.remove(LOCK_FILE) except OSError: os.system("rm -f %s" % LOCK_FILE)
在程序中直接加入以上代码即可,由于用了@atexit.register对clearLockFile进行了装饰,所以当Python程序退出时,会自动调用clearLockFile函数的。
补充:
另外我在搜索时,发现了另外一个实现方法,比起我上面的这个方法来说,更加简洁。
转载地址:http://blog.sina.com.cn/s/blog_5dabedc70100u3bx.html
比较传统的是使用pid文件,但是需要退出的时候删除这个文件,虽然可以使用python的atexit的回调函数,但还不是非常简洁。
使用socket.bind可以达到同样的效果。这个是一个例子:
#!/usr/bin/python"""implementation of singleton by socket"""# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 autoindent nuimport osimport timeimport sysimport traceback################# code starts here ######################def print_trace_stack_info(): tp, val, tb = sys.exc_info() error_msgs = traceback.format_exception(tp, val, tb) print "Python Traceback Information:" for msg in error_msgs: print msg def enter_singleton(port=295636): """ enable singleton for python module """ import socket # used by singleton try: global s # global, otherwise s will be destroyed when this function returns s = socket.socket() host = socket.gethostname() s.bind((host, port)) return True except socket.error: # this error is expected return False except: # for unexpected errors, always show unprocessed error print_trace_stack_info() return Falseif __name__ == "__main__": #import doctest #doctest.testmod() if not enter_singleton(): print "pid {%d}: duplicated instance, Quit!" %(os.getpid()) sys.exit(0) print "pid {%d}: start to run ..." %(os.getpid()) time.sleep(10) print "pid {%d}: Exit." %(os.getpid())
- Python锁文件实现(其中第二种方法是转载的)
- 百度2017年暑假实习生编程题目(第二题)----2、页面调度 在计算机中,页式虚拟存储器实现的一个难点是设计页面调度(置换)算法。其中一种实现方式是FIFO算法。
- c# 动态加载dll文件,并实现调用其中的方法
- python删除文件与目录的方法 转载
- 【Python】 2种实现文件复制的方法
- python实现跨文件全局变量的方法
- 实现线程的第二种方法
- 实现线程的第二种方法
- Java实现文件拷贝(包括文件夹下的子文件夹和其中的文件)
- 三种实现交换的方法,其中一个诡异的swap函数——C/C++语言(问题求助)
- python 遍历所有文件文件夹,并且搜索其中的字符串
- (转载)线程定时执行的两种实现方法
- 多线程的三种实现方法{转载}
- 组合快捷键的实现方法(转载)
- 单例类的实现方法(转载)
- 三大牛人看外国文献的方法(注明是转载)
- 不安装python运行python文件或者是用其他语言调用python模块的方法
- 转载!!!决策树的python实现
- fourinone学习笔记一(上手demo)
- 顺时针打印矩阵
- How to Convert AVFrame from NSImage or UIImage
- Spring 事务管理
- 基于jsp的ajax
- Python锁文件实现(其中第二种方法是转载的)
- chsh
- Workflow Save as to Database,Encounter error: 1004: Language is not enabled
- C#执行DOS命令,返回DOS命令的输出
- 简单了解HTTP消息头
- 对于当前java 文件比较 diffutils-1.2.1.jar 的使用和修改
- 使用struts2+spring+tomcat+mysql数据库开发中文乱码问题解决方案
- perl,php程序只运行一个
- Read Image