2013-01-11 4 views

Antwort

3

Es sei denn, Sie verwenden PyDLL oder PYFUNCTYPE; Die GIL wird während der Ctypes-Aufrufe freigegeben. Daher sollte der Python-Interpreter SIGINT behandeln, indem er im Hauptthread KeyboardInterrupt aufruft, wenn der C-Code seinen eigenen Signal-Handler nicht installiert.

Damit der Python-Code im Hauptthread ausgeführt werden kann; Sie könnten die ctypes Thread aufrufen in einen Hintergrund setzen:

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

Die GIL! Na sicher. Danke, JF. Das ist es wert, dir die Antwort zu geben, anstatt es für mich selbst zu nehmen. –

1

Sie müssen einen Signal-Handler für SIGINT innerhalb des C deklarieren, was hoffentlich Ihr Projekt ist.

+0

Meine Erfahrung mit SIGINT in geteilten Objekten ist, dass ein Handler benötigt wird. Es reicht nicht, Signale zu blockieren und einen Thread mit sigwait warten zu lassen. –

1

ich verwendet, um eine Gewinde Lösung, aber dann auf ein Signal umgeschaltet. Die Work-around ist verwende ich SIGTERM von SIGINT-Handler zu senden, zB:

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

Hier ist es beim nächsten Mal schneller und der Grund, warum ich möchte nur eine Kernidee der Lösung sparen zu finden, warum ich mich verändert habe die Ansatz. Die Thread-Variante passt nicht zu mir, da OpenMP deutlich langsamer wird, wenn es nicht vom Hauptthread aufgerufen wird.