| "" "
|
| Ví dụ về việc sử dụng fcntl.flock để khóa tệp. Một số mã lấy cảm hứng từ mô -đun Filelock.
|
| "" "
|
|
|
| Ví dụ về việc sử dụng fcntl.flock để khóa tệp. Một số mã lấy cảm hứng từ mô -đun Filelock. os
|
| Nhập khẩu fcntl
|
| Nhập khẩufcntl time
|
|
|
|
|
| nhập khẩu acquire(lock_file):
|
| defacquire (lock_file): = os.O_RDWR | os.O_CREAT | os.O_TRUNC
|
| open_mode = os.o_rdwr | os.o_creat | os.o_trunc = os.open(lock_file, open_mode)
|
|
|
| fd = os.open (lock_file, open_mode) = os.getpid()
|
| lock_file_fd=None = None
|
|
|
| timeout=5.0 = 5.0
|
| pid = os.getPid () = current_time = time.time()
|
| whilecurrent_time current_time < start_time + timeout:
|
| start_time = current_time = Time.time ():
|
| thử:
|
| # Lock_ex có nghĩa là chỉ có một quy trình có thể giữ khóa
|
| # Lock_nb có nghĩa là fcntl.flock () không chặn
|
| # và chúng tôi có thể thực hiện chấm dứt trong khi vòng lặp,
|
| # Khi hết thời gian chờ.
|
| # Thông tin thêm ở đây:
|
| # https://docs.python.org/3/l Library/fcntl.html#fcntl.flock.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
| fcntl.flock (fd, fcntl.lock_ex | fcntl.lock_nb) (IOError, OSError):
|
| Ngoại trừ (Ioerror, Oserror):
|
| đi qua:
|
| lock_file_fd=fd = fd
|
| break
|
| khác:(f' {pid} waiting for lock')
|
| in (f '{pid} đang chờ khóa').sleep(1.0)
|
| thời gian.s ngủ (1.0) = time.time()
|
| current_time = Time.time () lock_file_fd is None:
|
| iflock_file_fdisnone:.close(fd)
|
| returnlock_file_fd lock_file_fd
|
|
|
|
|
| OS.CLOSE (FD) release(lock_file_fd):
|
| DEFRELEASE (LOCK_FILE_FD):
|
| # Không xóa Lockfile:
|
| #
|
| # https://github.com/benediktschmitt/py-filelock/issues/31
|
| # https://stackoverflow.com/questions/17708885/flock-removing-locked-file-without-race-to-con.flock(lock_file_fd, fcntl.LOCK_UN)
|
| fcntl.flock (lock_file_fd, fcntl.lock_un).close(lock_file_fd)
|
| Os.close (Lock_File_FD) None
|
|
|
|
|
| trả lại main():
|
| fd = os.open (lock_file, open_mode) = os.getpid()
|
| pid = os.getPid ()(f'{pid} is waiting for lock')
|
|
|
| start_time = current_time = Time.time () = acquire('myfile.lock')
|
|
|
| thử: fd is None:
|
| # Lock_ex có nghĩa là chỉ có một quy trình có thể giữ khóa(f'ERROR: {pid} lock NOT acquired')
|
| return-1 -1
|
|
|
| # Lock_nb có nghĩa là fcntl.flock () không chặn(f"{pid} lock acquired...")
|
| # và chúng tôi có thể thực hiện chấm dứt trong khi vòng lặp,.sleep(2.0)
|
| # Khi hết thời gian chờ.(fd)
|
| # Thông tin thêm ở đây:(f"{pid} lock released")
|
|
|
|
|
| # https://docs.python.org/3/l Library/fcntl.html#fcntl.flock
|
| fcntl.flock (fd, fcntl.lock_ex | fcntl.lock_nb) __name__ == '__main__':
|
| Ngoại trừ (Ioerror, Oserror):()
|
|
|
|
|