gpt4 book ai didi

Python线程: interpreter shutdown exception

转载 作者:行者123 更新时间:2023-12-01 05:44:21 27 4
gpt4 key购买 nike

我正在用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com