ayuLiao
2/12/2019 - 9:37 AM

python文件锁

利用fcntl实现文件锁

在uwsgi的环境下,因为uwsgi会开启多个python进行接收请求,此时要求并发请求时,某些步骤单步执行,就需要使用外部锁,而不是使用进程内的逻辑锁,最简单的外部锁就是文件锁,使用fcntl,实现文件锁会非常简单。

import os
import fcntl

class Lock(object):
    def __init__(self, filename):
        self.filename = filename
        self.handle = open(filename,'w')

    def acquire(self):
        # if you need a non-blocking lock, use fcntl.LOCK_NB
        fcntl.flock(self.handle, fcntl.LOCK_EX)

    def release(self):
        fcntl.flock(self.handle, fcntl.LOCK_UN)

    def __del__(self):
        self.handle.close()

'''
flask 对应的请求方法,当多个请求来时,调用该方法,将其变为单步执行
'''
def filelocktest():
    try:
        lock = Lock('./deploy_lock.tmp')
        lock.acquire()
        time.sleep(5)
        print('filelock is running')
    finally:
        lock.release()