Domanda

Ho una domanda su come funziona flock(), in particolare in pitone. Ho un modulo che si apre una connessione seriale (tramite os.open()). Ho bisogno di fare questo thread-safe. E 'abbastanza facile rendendo thread-safe quando si lavora nello stesso modulo utilizzando threading.Lock(), ma se il modulo viene importata da luoghi diversi, si rompe.

Stavo pensando di usare flock(), ma sto avendo problemi a trovare informazioni sufficienti su come esattamente funziona gregge. Ho letto che flock () sblocca il file una volta che il file viene chiuso. Ma c'è una situazione che non mancherà di tenere aperto il file, se si blocca pitone?

E che cosa esattamente è consentito utilizzare il file bloccato se LOCK_EX è impostato? Proprio il modulo che ha bloccato il file? Ogni modulo che è stato importato dal copione che è stato originariamente eseguito?

È stato utile?

Soluzione

Quando un processo muore il sistema operativo dovrebbe ripulire tutte le risorse di file aperti (con alcuni avvertimenti, sono sicuro). Questo perché il lock consultivo viene rilasciato quando il file viene chiuso, operazione che si verifica come parte del sistema operativo di pulizia quando il processo termina python.

Ricordate, flock (2) è semplicemente advisory:

  

serrature Advisory permettono cooperante processi per eseguire operazioni consistenti sui file, ma [altro, mal si comportavano] processi possono ancora accedere ai file senza utilizzare serrature consulenza.

flock (2) implementa un readers- blocco scrittore. Non si può affollano lo stesso file due volte con LOCK_EX, ma qualsiasi numero di persone possibile affollano con LOCK_SH contemporaneamente (a patto che nessun altro ha un LOCK_EX su di esso).

  

Il meccanismo di bloccaggio permette due tipi di blocchi: blocchi condivisi e blocchi esclusivi. In qualsiasi momento più condiviso serrature possono essere applicati a un file, ma in nessun momento sono esclusivi multipla, o entrambi i comuni ed esclusive, serrature ammessi contemporaneamente su un file.

gregge funziona a livello di OS / processo ed è indipendente da moduli Python. Un modulo può richiedere n serrature, o n serrature potrebbe essere richiesto attraverso m moduli. Tuttavia, solo un processo può contenere un blocco LOCK_EX su un determinato file in un determinato momento.

YMMV su un sistema "non-UNIX" o di un file system non locale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top