我正在为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()
工作正常。
答案 0 :(得分:2)
首先,您可以忽略此错误。如果您的程序有效,则可以忽略关闭期间的任何错误。我完全和你在一起,这不是应该做的事情,并且需要一个干净的解决方案。
我认为缺少的是对thread.join()
的呼吁。您当前正忙着等待线程从isAlive()
(应该是is_alive()
,顺便说一句)返回false,使用join()
更清晰,更短。
BTW:没有必要从Thread
类派生,这使得代码更短。我个人觉得它也更清楚,因为Python对象只是线程的句柄,而不是线程本身。
答案 1 :(得分:0)
我看到它的方式,主线程刚刚再次启动处理器线程后结束。
你有没有尝试在启动后放置while
?
P.S。:另外,一些不错的工作代码可以让想要帮助的人更容易调试。