2013-01-11 12 views

risposta

3

A meno che non si usi PyDLL o PYFUNCTYPE; il GIL viene rilasciato durante le chiamate ctypes. Quindi l'interprete Python dovrebbe gestire SIGINT sollevando KeyboardInterrupt nel thread principale se il codice C non installa il proprio gestore di segnale.

Per consentire l'esecuzione del codice Python nel thread principale; si potrebbe mettere le ctypes mettono in un thread in background:

import threading 

t = threading.Thread(target=ctypes_call, args=[arg1, arg2, ...]) 
t.daemon = True 
t.start() 
while t.is_alive(): # wait for the thread to exit 
    t.join(.1) 
+0

The GIL! Ovviamente. Grazie, JF. Vale la pena darti la risposta invece di prenderla per me. –

1

Dovrete dichiarare un gestore di segnale per SIGINT, all'interno del C, che è, si spera, il vostro progetto.

+0

La mia esperienza con SIGINT in oggetti condivisi è che è necessario un gestore. Non è sufficiente bloccare i segnali e avere un thread in attesa usando sigwait. –

1

ho usato una soluzione filettato, ma poi passato a un segnale di uno. Il work-around che uso è quello di inviare SIGTERM dal gestore SIGINT, ad esempio:

signal.signal(signal.SIGINT, lambda s, f : os.kill(os.getpid(), signal.SIGTERM)) 

Qui voglio solo salvare un'idea centrale della soluzione per trovare più velocemente la prossima volta e il motivo per cui hanno cambiato il approccio. La variante filettata non è adatta per me perché OpenMP diventa molto più lento quando viene chiamato non dal thread principale.

Problemi correlati