簡體   English   中英

在Cython中用鍵盤中斷`while循環`

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM