Domanda

modulo fcnt di Python fornisce un metodo chiamato [moltitudine] [1] per blocco di file controllato. E 'di descrizione si legge:

  

Eseguire l'op operazione di blocco in archivio   descrittore fd (gli oggetti file che forniscono   un metodo fileno () sono accettati come   bene). Vedere il gregge manuale di Unix (2)   per dettagli. (Su alcuni sistemi, questo   funzione viene emulata tramite fcntl ()).

Alzando la Linux man per flock, si riferisce soltanto alla croce bloccaggio processo, ad esempio:

  

Una chiamata a flock () può bloccare se un   serratura incompatibile è tenuto da un'altra   processi. Per fare un non bloccante   richiesta, comprendono LOCK_NB (da ORing)   con qualsiasi delle suddette operazioni.

Quindi la mia domanda è:? Accorreranno () forniscono anche filo di bloccaggio di sicurezza e bloccare più thread all'interno dello stesso processo così come le discussioni di diversi processi

[1]: http://docs.python.org/library/ fcntl.html # fcntl.flockfunction viene emulato utilizzando fcntl ()).

È stato utile?

Soluzione

serrature flock non si preoccupano di discussioni - in realtà, essi non si preoccupano di processi, sia. Se si prende la stessa descrittore di file in due processi (ereditato attraverso una forcella), entrambi i processi bloccando il file con quel FD acquisirà una serratura per entrambi i processi. In altre parole, il seguente codice sia chiamate flock tornerà successo: il processo figlio blocca il file, e quindi il processo padre acquisisce lo stesso blocco, piuttosto che il blocco, perché sono entrambi lo stesso FD .

import fcntl, time, os

f = open("testfile", "w+")
print "Locking..."
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
print "locked"
fcntl.flock(f.fileno(), fcntl.LOCK_UN)

if os.fork() == 0:
    # We're in the child process, and we have an inherited copy of the fd.
    # Lock the file.
    print "Child process locking..."
    fcntl.flock(f.fileno(), fcntl.LOCK_EX)
    print "Child process locked..."
    time.sleep(1000)
else:
    # We're in the parent.  Give the child process a moment to lock the file.
    time.sleep(0.5)

    print "Parent process locking..."
    fcntl.flock(f.fileno(), fcntl.LOCK_EX)
    print "Parent process locked"
    time.sleep(1000)

Sulla stessa ragione, se si blocca lo stesso file due volte, ma con diversi descrittori di file, le serrature bloccherà l'altro - indipendentemente dal fatto che sei nello stesso processo o lo stesso thread. Vedere flock (2): If a process uses open(2) (or similar) to obtain more than one descriptor for the same file, these descriptors are treated independently by flock(). An attempt to lock the file using one of these file descriptors may be denied by a lock that the calling process has already placed via another descriptor.

E 'utile ricordare che al kernel Linux, processi e thread sono essenzialmente la stessa cosa, e che stanno generalmente trattata nello stesso dalle API a livello di kernel. Per la maggior parte, se una chiamata di sistema di documenti tra processi comportamento del bambino / genitore, lo stesso sarà tenere per le discussioni.

Naturalmente, è possibile (e probabilmente dovrebbe) testare questo comportamento da soli.

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