0

magical_attack(energy)1 秒以上続く場合とそうでない場合がある Python 関数があるとします。無限ループになる可能性さえありますか?どうすれば実行できますか。ただし、1 秒を超える場合は終了し、プログラムの残りの部分に伝えます。これを行うための洗練されたモジュールを探しています。例:

import timeout
try: timout.run(magical_attack(5), 1)
except timeout.timeouterror:
    blow_up_in_face(wizard)

注: 関数を変更することはできません。実行時に外部から送信されます。

4

2 に答える 2

0

この詳細を除いて、Abamert は私が準備していた回答で私を打ち負かしました。

外部関数が Python インタープリターを介して実行される場合に限り、(たとえば、コンパイルされたモジュールから) 変更することはできませんが、この他の質問で説明されている手法を使用して、例外を使用してその関数を呼び出すスレッド。

Python でスレッドを強制終了する方法はありますか?

もちろん、呼び出していた関数を制御できた場合、その回答の StoppableThread クラスはこれに適しています。

import threading

class StoppableThread(threading.Thread):
    """Thread class with a stop() method. The thread itself has to check
    regularly for the stopped() condition."""

    def __init__(self):
        super(StoppableThread, self).__init__()
        self._stop = threading.Event()

    def stop(self):
        self._stop.set()

    def stopped(self):
        return self._stop.isSet()

class Magical_Attack(StoppableThread):
    def __init__(self, enval):
        self._energy = enval
        super(Magical_Attack, self).__init__()

    def run(self):
        while True and not self.stopped():
            print self._energy

if __name__ == "__main__":
    a = Magical_Attack(5)
    a.start()
    a.join(5.0)
    a.stop()
于 2013-08-29T21:16:43.720 に答える