2013-01-11 18 views

回答

3

除非您使用PyDLLPYFUNCTYPE; GIL在ctypes調用期間被釋放。因此,如果C代碼沒有安裝自己的信號處理程序,則Python解釋程序應該通過在主線程中提升KeyboardInterrupt來處理SIGINT。

允許Python代碼在主線程中運行;你可以把ctypes呼叫放到後臺線程中:

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!當然。謝謝,JF。這值得給你答案,而不是爲自己服用。 –

1

您將不得不在C中聲明一個SIGINT的信號處理程序,希望這是您的項目。

+0

我在共享對象中使用SIGINT的經驗是需要一個處理程序。阻塞信號並使用sigwait等待線程是不夠的。 –

1

我使用了一個線程解決方案,但後來切換到一個信號。 工作,圍繞我用的是從SIGINT處理程序發送SIGTERM,如:

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

在這裏,我只是想保存解決方案的核心思想更快地找到它下一個時間和原因,我已經改變了做法。線程變體對我來說並不適合,因爲不是從主線程調用OpenMP時,OpenMP會變得非常慢。