当前位置: 主页 > 日志 > Python >

Python跨进程级锁的一种实现

跨进程级锁可以使独立进程间互斥地访问某共享资源(比如,多进程共同写一个文件)。

这里通过文件锁实现,源码如下:

# coding: utf-8
# processlock.py
# 进程锁 - 进程间互斥锁

import os
try:
    import fcntl
    LOCK_EX = fcntl.LOCK_EX
except ImportError:
    # Windows平台下没有fcntl模块
    fcntl = None
    import win32con
    import win32file
    import pywintypes
    LOCK_EX = win32con.LOCKFILE_EXCLUSIVE_LOCK
    overlapped = pywintypes.OVERLAPPED()

class Lock:
    """进程锁
    """
    
    def __init__(self, filename='processlock.txt'):
        self.filename = filename
        # 如果文件不存在则创建
        self.handle = open(filename, 'w')

    def acquire(self):
        # 给文件上锁
        if fcntl:
            fcntl.flock(self.handle, LOCK_EX)
        else:
            hfile = win32file._get_osfhandle(self.handle.fileno())
            win32file.LockFileEx(hfile, LOCK_EX, 0, -0x10000, overlapped)

    def release(self):
        # 文件解锁
        if fcntl:
            fcntl.flock(self.handle, fcntl.LOCK_UN)
        else:
            hfile = win32file._get_osfhandle(self.handle.fileno())
            win32file.UnlockFileEx(hfile, 0, -0x10000, overlapped)

    def __del__(self):
        try:
            self.handle.close()
            os.remove(self.filename)
        except:
            pass

if __name__ == '__main__':
    # 测试:依次运行本程序多个实例,第N个实例运行耗时是第一个的N倍
    import time
    print 'Time: %s' % time.time()

    lock = Lock()
    try:
        lock.acquire()
        time.sleep(20)
    finally: 
        lock.release()

    print 'Time: %s' % time.time()

 

参考:

http://stackoverflow.com/questions/19830822/multiple-processes-write-a-same-csv-file-how-to-avoid-conflict

http://blog.vmfarms.com/2011/03/cross-process-locking-and.html

http://code.activestate.com/recipes/65203-portalocker-cross-platform-posixnt-api-for-flock-s/

[日志信息]

该日志于 2013-11-08 15:35 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “Python跨进程级锁的一种实现” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部