2013-01-11 11 views

Odpowiedz

3

Jeśli nie używasz PyDLL lub PYFUNCTYPE; GIL jest zwalniany podczas wywołań ctypes. Dlatego interpreter Pythona powinien obsługiwać SIGINT, podnosząc KeyboardInterrupt w wątku głównym, jeśli kod C nie zainstaluje własnego programu obsługi sygnału.

Aby umożliwić uruchomienie kodu Pythona w wątku głównym; można umieścić ctypes zadzwonić do wątku tła:

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

GIL! Oczywiście. Dzięki, JF. Warto dać ci odpowiedź, zamiast brać ją dla siebie. –

1

Będziesz musiał zadeklarować procedurę obsługi sygnału dla SIGINT, w C, która jest, mam nadzieję, twoim projektem.

+0

Moje doświadczenie z SIGINT w obiektach udostępnionych jest takie, że potrzebny jest program obsługi. Nie wystarczy blokować sygnałów i mieć wątek czekający przy użyciu polecenia sigwait. –

1

użyłem gwintowany rozwiązanie, ale następnie przełącza się na sygnał wyjścia. Prace wokół używam to wysłać SIGTERM od SIGINT obsługi, np:

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

Tutaj po prostu chcesz zapisać pomysł rdzenia roztworu go znaleźć szybciej następnym razem i powód, dlaczego zmienili podejście. Wariant gwintowany nie jest dla mnie odpowiedni, ponieważ OpenMP staje się znacznie wolniejszy, gdy nie jest wywoływany z głównego wątku.

Powiązane problemy