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())











原创粉丝点击