[Mi scuso per il titolo inetto; Non potrei inventarmi niente di meglio. I suggerimenti per un titolo migliore sono i benvenuti.]Come dare una funzionalità simile alla dichiarazione con la classe?
Desidero implementare un'interfaccia per i file HDF5 che supporta la concorrenza a livello multiprocesso tramite il blocco dei file. L'ambiente previsto per questo modulo è un cluster Linux che accede a un disco condiviso su NFS. L'obiettivo è abilitare l'accesso simultaneo (su NFS) allo stesso file da più processi paralleli in esecuzione su diversi host differenti.
Mi piacerebbe essere in grado di implementare la funzionalità di blocco attraverso una classe wrapper per la classe h5py.File
. (h5py
offre già il supporto per filo concorrenza -livello, ma la biblioteca HDF5 sottostante non è thread-safe.)
Sarebbe bello se potessi fare qualcosa nello spirito di questa:
class LockedH5File(object):
def __init__(self, path, ...):
...
with h5py.File(path, 'r+') as h5handle:
fcntl.flock(fcntl.LOCK_EX)
yield h5handle
# (method returns)
Mi rendo conto che il codice sopra riportato è sbagliato, ma spero che trasmetta l'idea principale: vale a dire che l'espressione LockedH5File('/path/to/file')
invii un handle aperto al codice client, che può quindi eseguire varie operazioni di lettura/scrittura arbitrarie su di esso. Quando questo handle esce dall'ambito, il suo distruttore chiude la maniglia, rilasciando in tal modo il blocco.
L'obiettivo che motiva questo accordo è duplice:
disaccoppiare la creazione del manico (dal codice della libreria) dalle operazioni che vengono successivamente richiesti sul manico (da parte del cliente codice), e
mantenere la maniglia è chiusa e la serratura rilasciato, non importa cosa succede durante l' esecuzione del codice intermedio (es eccezioni, gestite segnali, Python errori interni).
Come posso ottenere questo effetto in Python?
Grazie!