home changes contents help options

161:ファイルをロックする

Unix 系 OS では

fcntl モジュールの flock 関数を用います。動作の詳細は OS 依存なので、使用の際にはそのシステムの flock 、 fcntl のドキュメントも参照してください。

import fcntl
def lock(fobj, flag=fcntl.LOCK_SH):
    fcntl.flock(fobj.fileno(), flag)
def unlock(fobj):
    fcntl.flock(fobj.fileno(), fcntl.LOCK_UN)

flock 関数に使用できるフラグには次のものがあります。

fcntl.LOCK_SH
共有ロックする
fcntl.LOCK_EX
排他ロックする
fcntl.LOCK_NB
flock 関数をノンブロッキングで使用する
fcntl.LOCK_UN
ロックを解除する

Windows では

PyWin32? を使用して LockFileEx? , UnlockFileEx? を呼び出します。

import win32con, win32file, pywintypes

def lock(fobj, flag=0):
    overlapped = pywintypes.OVERLAPPED()
    handle = win32file._get_osfhandle(fobj.fileno())
    win32file.LockFileEx(handle, flag, 0, 0x7fffffff, overlapped)

def unlock(fobj):
    overlapped = pywintypes.OVERLAPPED()
    handle = win32file._get_osfhandle(fobj.fileno())
    win32file.UnlockFileEx(handle, 0, 0x7fffffff, overlapped)

LockFileEx? のフラグには次のものがあります。

win32con.LOCKFILE_EXCLUSIVE_LOCK
排他ロックする
win32con.LOCKFILE_FAIL_IMMEDIATETY
LockFileEx? 関数をノンブロッキングで使用する