Permettendo filetti da pitone dopo aver chiamato un blocco I / code o in un'estensione pitone generato usando SWIG

StackOverflow https://stackoverflow.com/questions/2510696

  •  22-09-2019
  •  | 
  •  

Domanda

Ho scritto un'estensione python avvolgendo un C ++ esistente biblioteca LIVE555 (avvolgendo interfaccia client RTSP per essere precisi) in SWIG . L'estensione funziona quando viene utilizzato in un singolo thread, ma non appena io chiamo la funzione ciclo di eventi della biblioteca, interprete Python non ottiene mai il controllo indietro. Quindi, se creo un'operazione pianificata utilizzando threading.Timer destra prima di chiamare il ciclo degli eventi, questo compito non viene eseguito una volta inizia ciclo di eventi. Per risolvere questo problema, ho aggiunto Py_BEGIN_ALLOW_THREADS e Py_END_ALLOW_THREADS macro manualmente nel file cxx involucro generato SWIG auto dietro ogni chiamata di funzione doEventLoop(). Ma ora, voglio fare lo stesso (cioè consentire discussioni) quando SWIG genera il codice stesso e di non modificare il codice manualmente. Qualcuno ha fatto qualcosa di simile in SWIG?

P.S. - Vorrei anche prendere in considerazione il passaggio a qualsiasi altro quadro (come SIP) per ottenere questo lavoro. Ho selezionato SWIG su qualsiasi altra tecnologia è perché scrivere interfaccia SWIG era davvero molto facile e ho dovuto includere i file di intestazione esistenti.

È stato utile?

Soluzione

SWIG ti dà un sacco di ganci per contribuire a rendere questo accada. Se una soluzione di massima è sufficiente per le vostre esigenze, una cosa che ho fatto in passato è messo qualcosa di simile nel mio file .swig:

%exception {
    Py_BEGIN_ALLOW_THREADS
    $action
    Py_END_ALLOW_THREADS
}

Questo (ab) utilizza la funzione di SWIG per decorare funzione C chiamate con un certo tipo di logica di gestione degli errori per decorare le chiamate con un GIL sblocco / blocco. Vedere gestione delle eccezioni con% eccezioni nella documentazione SWIG per i dettagli su ciò che è succedendo qui.

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