Query se Python filettatura.La serratura è bloccata o non

Ho un thread sono in esecuzione (codice qui sotto), che lancia un blocco del processo secondario. Per assicurarsi che gli altri thread non avviare lo stesso processo secondario, ho un blocco intorno a questo subprocess.call chiamata. Voglio anche essere in grado di risolvere questo sottoprocesso di chiamata, in modo che ho di una funzione di arresto che io chiamo da qualche altra parte. Nel caso In cui il sottoprocesso è fermato prima, voglio rilasciare il blocco, che è ciò che il seguente codice:

class SomeThread(threading.Thread):
   def run(self):
      aLock.acquire()
      self.clip = subprocess.call([ 'mplayer', 'Avatar.h264'], stdin=subprocess.PIPE)
      aLock.release()
   def stop(self):
      if self.clip != None and self.clip.poll() == True:
         try:
            self.clip.send_signal(signal.SIGINT)
         except:
            pass
      aLock.release()

Tuttavia, in base alla documentazione qui, chiamando release() su di un rilascio di blocco solleva un’Eccezione:

A RuntimeError is raised if this method is called when the lock is unlocked.

C’è una funzione di query come aLock.isLocked()?

InformationsquelleAutor puk | 2013-10-19



One Reply
  1. 32

    Sicuro!

    >>> from threading import Lock
    >>> x = Lock()
    >>> x.locked()
    False
    >>> x.acquire()
    True
    >>> x.locked()
    True

    Si potrebbe anche fare un non-blocking acquisire:

    x.acquire(False)
    x.release()

    In questo caso, se x è stato sbloccato il codice lo acquisisce e lo rilascia. Ma se x è stato già bloccato, il non-blocking acquisire restituisce in una sola volta (e restituisce False), e abbiamo di nuovo rilascio. Ma che è soggetto a gare! Non c’è nulla per fermare qualche altro thread di rilasciare il blocco tra quelle due righe.

    Idem per il controllo .locked(). Che dice solo lo stato del blocco al momento .locked() è stato eseguito. Si può non essere più vero dal momento che si esegue l’istruzione successiva.

    Dal modo in cui il corpo di run() è meglio scritto utilizzando il blocco come un “contesto manager”, in questo modo:

    def run(self):
        with aLock:
            self.clip = subprocess.call([ 'mplayer', 'Avatar.h264'], stdin=subprocess.PIPE)

    Questo il acquire()/release() coppia per voi, ed è molto più robusto rispetto a imprevisti le eccezioni sollevate nel corpo del with blocco (Python fa tutto il possibile per rilasciare il blocco, se il corpo è uscito per qualsiasi ragione).

    • E ‘ come inizio…dobbiamo andare più in profondità
    • Beh, perché non documentazione parlare del locked() funzione?

Lascia un commento