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 方法时,出现以下错误:

线程 Thread-3 中的异常(很可能在解释器关闭期间引发)

我该如何纠正这个问题?谢谢。

编辑:我将代码分解为基本要素,发现它实际上工作正常。我没有注意到我的 HALT 方法实际上是以关闭所有处理器外围线程的方式编写的,包括运行电传打印机模拟器的线程。如果没有电传打印机输出到它,仿真器核心似乎在第二次测试中崩溃了。

这是测试用例:

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(). 您目前正忙于等待线程从isAlive()(应该是is_alive(),顺便说一句)返回 false,使用join()更简洁、更短。

BTW:不需要从Thread类派生,这使得代码更短。我个人也觉得它更清楚,因为 Python 对象只是线程的句柄,而不是线程本身。

于 2013-05-18T13:16:02.117 回答
0

在我看来,主线程在再次启动处理器线程后结束。你有没有试过while在启动后放一个?

PS:另外,一些不错的工作代码将使那些想要帮助的人更容易调试。

于 2013-05-18T09:59:12.633 回答