[Tôi xin lỗi vì tiêu đề inept; Tôi không thể nghĩ ra điều gì tốt hơn. Đề xuất cho một tiêu đề tốt hơn được chào đón.]Làm cách nào để cung cấp chức năng giống như tuyên bố cho lớp học?
Tôi muốn triển khai giao diện cho HDF5 tệp hỗ trợ đồng thời đa cấp thông qua khóa tệp. Môi trường dự định cho mô-đun này là một cụm Linux truy cập vào một đĩa được chia sẻ trên NFS. Mục đích là để cho phép truy cập đồng thời (trên NFS) vào cùng một tệp bằng nhiều tiến trình song song chạy trên một vài máy chủ khác nhau.
Tôi muốn có thể triển khai chức năng khóa thông qua lớp trình bao bọc cho lớp h5py.File
. (h5py
đã cung cấp hỗ trợ cho chủ đề -level đồng thời, nhưng thư viện HDF5 cơ bản không phải là thread-safe.)
Nó sẽ là tuyệt vời nếu tôi có thể làm điều gì đó theo tinh thần điều này:
class LockedH5File(object):
def __init__(self, path, ...):
...
with h5py.File(path, 'r+') as h5handle:
fcntl.flock(fcntl.LOCK_EX)
yield h5handle
# (method returns)
Tôi nhận ra rằng mã trên là sai, nhưng tôi hy vọng nó chuyển tải ý tưởng chính: cụ thể là, để có biểu thức LockedH5File('/path/to/file')
cung cấp xử lý mở cho mã máy khách, sau đó có thể thực hiện các hoạt động đọc/ghi tùy ý khác nhau trên đó. Khi xử lý này đi ra khỏi phạm vi, destructor của nó đóng cửa xử lý, do đó phát hành khóa.
Các mục tiêu đó thúc đẩy sự sắp xếp này là hai lần:
tách việc tạo ra các xử lý (bằng mã thư viện) từ hoạt động mà sau đó được yêu cầu trên tay cầm (do khách hàng mã) và
đảm bảo rằng tay cầm được đóng và khóa được giải phóng, bất kể điều gì xảy ra trong quá trình thực thi mã intervening (ví dụ: ngoại lệ, unhandled tín hiệu, lỗi nội bộ Python).
Làm cách nào tôi có thể đạt được hiệu ứng này bằng Python?
Cảm ơn!