Python线程: interpreter shutdown exception

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

Exception in thread Thread-3 (most likely raised during interpreter shutdown)

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

编辑:我将代码分解为最基本的部分,发现它实际上工作正常。我没有注意到我的 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()

工作正常。

最佳答案

首先,您可以忽略此错误。如果您的程序正常运行,则关闭期间的任何错误都可以忽略。我完全同意你的观点,事情不应该是这样的,需要一个干净的解决方案。

我认为缺少的是对thread.join()的调用。您当前正忙于等待线程使用 join()isAlive() (应该是 is_alive(),btw)返回 false code> 更干净、更短。

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

关于Python线程: interpreter shutdown exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16622804/

相关文章:

python - Pygame 创建无限数量的敌人

python - 属性错误: module 'cv2' has no attribute 'face' (OpenCV and Python)

java - 实现线程安全的指数量规

android - 带有 Visual Studio 的 Android 模拟器上的奇怪解决方案

ios - 如何设置默认设备以在 Ionic 中进行模拟?

python - 将 pandas 数据框乘以固定行数

python - 将字符串中的 xyz 坐标值提取到列表中

java - groovy 中的 Join() 不等待线程完成

.net - .NET Framework线程 “ancestry”

c++ - 在仿真器中使用 union 来模拟 CPU 寄存器有多合适?