[英]Interrupting `while loop` with keyboard in Cython
我希望能夠使用通常的CTRL + C中斷命令使用cython中斷長函數。 我的C ++ long函數在Cython代碼的while循環中重復調用,但我希望能夠在循環期間發送“中斷”並阻止while循環。
中斷也應該等待longFunction()完成,這樣就不會丟失數據或保持未知狀態。
這是我的第一個實現之一,顯然不起作用:
computed=0;
print "Computing long function..."
while ( computed==0 ):
try:
computed = self.thisptr.aLongFunction()
except (KeyboardInterrupt, SystemExit):
computed=1
print '\n! Received keyboard interrupt.\n'
break;
(ps self.thisptr
是指向實現aLongFunction()
的當前類的指針)
你應該可以做這樣的事情:
import signal
class Test():
def __init__(self):
self.loop_finished = False
signal.signal(signal.SIGINT, self.abort_loop)
def abort_loop(self, signal, frame):
self.loop_finished = True
def go(self):
while not self.loop_finished:
print "Calculating"
# Do your calculations
# Once calcations are done, set self.loop_finished to True
print "Calculating over"
Test().go()
您還可以使用其他變量來跟蹤計算是否手動中止。
我不是Python C-Api foo大師,但這可行,但也許它不是最好的方法:
cdef extern from "Python.h":
int PyErr_CheckSignals()
def test_interrupt():
cdef int i = 0
while i < 9999999999 and not PyErr_CheckSignals():
# do fancy stuff.
i += 1
當然這不是異步,這可能是可能的,但我不知道,這打破了任何信號的循環,而不僅僅是Ctrl + C. 也許最好不要在每次循環迭代中檢查信號,至少如果做的是非常便宜的話。
你可以調用PyErr_Occurred
等,如果PyErr_CheckSignals
沒有返回0
,看看有什么樣的Exception
被提出專門用於KeybordInterrupt
或某些kill信號。 (無論如何,檢查python C-Api的詳細信息......)
如果你在while循環中調用cython cdef
函數,你可能也可以實現這個,如果你添加except *
:
cdef function(...) except *:
pass
另見http://docs.cython.org/src/userguide/language_basics.html#error-return-values
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.