python之跨進程鎖的實現---fcntl

============================================================================

原創作品,允許轉載。轉載時請務必以超鏈接形式標明原始出處、以及本聲明。

請註明轉自:http://yunjianfei.iteye.com/blog/

============================================================================

 

跨進程鎖的實現方式中,基於文件鎖的方式相對來說好一點。以下貼出一個簡單的代碼:

 

import os
import fcntl

class Lock: 
    def __init__(self, filename):
        self.filename = filename
        # This will create it if it does not exist already
        self.handle = open(filename, 'w')
    
    # Bitwise OR fcntl.LOCK_NB if you need a non-blocking lock 
    def acquire(self):
        fcntl.flock(self.handle, fcntl.LOCK_EX)
        
    def release(self):
        fcntl.flock(self.handle, fcntl.LOCK_UN)
        
    def __del__(self):
        self.handle.close()

# Usage
try:
    lock = Lock("/tmp/lock_name.tmp")
    lock.acquire()
    # Do important stuff that needs to be synchronized

finally: 
    lock.release()

 可以同時運行多份該程序來進行試驗。

 

這種方式的鎖有以下特點:

1. 鎖文件只在第一次調用的時候創建。

2. 鎖是通過kernel來控制的,不消耗磁盤IO

3. 這種方式的鎖只對同一個OS中的進程有效。跨服務器、OS是無效的,這時候需要選用分佈式鎖,比如Elock  http://dustin.sallings.org/elock/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章