Python线程:解释器关闭异常

时间:2013-05-18 09:40:01

标签: python multithreading emulation

我正在为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方法实际上是以关闭所有处理器外围线程的方式编写的,包括运行teleprinter仿真器的线程。没有电传打字机输出到它,看起来仿真器核心在第二次测试时崩溃了。

以下是测试用例:

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()

工作正常。

2 个答案:

答案 0 :(得分:2)

首先,您可以忽略此错误。如果您的程序有效,则可以忽略关闭期间的任何错误。我完全和你在一起,这不是应该做的事情,并且需要一个干净的解决方案。

我认为缺少的是对thread.join()的呼吁。您当前正忙着等待线程从isAlive()(应该是is_alive(),顺便说一句)返回false,使用join()更清晰,更短。

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

答案 1 :(得分:0)

我看到它的方式,主线程刚刚再次启动处理器线程后结束。 你有没有尝试在启动后放置while

P.S。:另外,一些不错的工作代码可以让想要帮助的人更容易调试。