1

Python でビンテージ コンピューター システム用のエミュレーターを作成していますが、停止状態から抜け出した後にエミュレーター コア スレッドを「再起動」しようとすると、例外がスローされて問題が発生します。より大きなクラスの一部である「プロセッサの実行」メソッドは、次のようになります。

def run_processor(self):
    processor = self

    class processor_thread(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
            self.daemon = True

        def run(self):
            while processor.running:
               #main loop for instruction fetch and decode is here   

    self.processor_thread = processor_thread()
    self.running = True   
    self.processor_thread.start()

メモリ イメージをプロセッサにロードし、プログラム カウンタを設定し、エミュレータでテスト プログラムを実行するメイン関数があります。これによりコンソールに何らかの出力が行われ、最終的にプロセッサの「HLT」命令によって「processor.running」が False に設定され、processor_thread が終了します。

これは問題なく動作しますが、run_processor をもう一度呼び出してプロセッサを再起動するテストで問題が発生しています。

processor = Processor(memory, scheduler, interrupts, teleprinter)
processor.program_counter = 128
processor.run_processor()
while processor.processor_thread.isAlive():
    pass
processor.program_counter = 128
processor.run_processor()

最初のインスタンスは正常に実行されますが、run_processor メソッドが 2 回目に呼び出されると、次のエラーが発生します。

スレッド Thread-3 の例外 (インタープリターのシャットダウン中に発生する可能性が最も高い)

どうすればこれを修正できますか? ありがとう。

編集:コードを必要最小限に分解したところ、実際に問題なく動作することがわかりました。私の HALT メソッドが実際には、テレプリンター エミュレーターを実行するスレッドを含むすべてのプロセッサ周辺スレッドをシャットダウンするように記述されていることに気付きませんでした。出力するテレプリンターがないと、2 番目のテストでエミュレーター コアがクラッシュしたように見えます。

テストケースは次のとおりです。

import threading
import time

class Processor(object):
    def __init__(self):
        self.running = False

    def halt_processor(self):
        self.running = False

    def run_processor(self):
        processor = self

        class processor_thread(threading.Thread):
            def __init__(self):
                threading.Thread.__init__(self)
                self.daemon = True

            def run(self):
                while processor.running:
                   #main loop for instruction fetch and decode is here   
                   print "Hello, I am the main loop doing my thing 1"
                   time.sleep(1)
                   print "Hello, I am the main loop doing my thing 2"
                   time.sleep(1)
                   print "I will halt now."
                   processor.halt_processor()

        self.processor_thread = processor_thread()
        self.running = True   
        self.processor_thread.start()

def test1():
    processor = Processor()
    processor.run_processor()

def test2():
    processor = Processor()
    processor.run_processor()
    while processor.processor_thread.isAlive():
        pass
    processor.run_processor()

def main():
     test2()

if __name__ == '__main__':
    main()

正常に動作します。

4

2 に答える 2

3

まず、このエラーは無視できます。プログラムが機能する場合、シャットダウン中のエラーは無視できます。これが本来あるべき姿ではなく、クリーンな解決策が求められていることは完全に同意します。

欠けていると思うのは への呼び出しthread.join()です。あなたは現在、スレッドが false を返すのを待っていますisAlive()(これは である必要がありますis_alive())。使用join()はよりクリーンで短いです。

ところで: クラスから派生させる必要がないためThread、コードが少し短くなります。Python オブジェクトは単なるスレッドのハンドルであり、スレッド自体ではないため、個人的にはより明確だと思います。

于 2013-05-18T13:16:02.117 に答える
0

私の見方では、メインスレッドはプロセッサスレッドを再開した直後に終了します。起動後に入れようとしましたwhileか?

PS: また、うまく機能するコードがあれば、支援したい人にとってデバッグがはるかに簡単になります。

于 2013-05-18T09:59:12.633 に答える