빈티지 컴퓨터 시스템 용 에뮬레이터를 파이썬으로 작성하고 있는데, 멈출 때마다 에뮬레이터 코어 스레드를 "다시 시작"하려고 할 때 예외가 발생합니다. 조건. 내가, 내가 프로세서에 메모리 이미지를로드 주요 기능을 가지고있는 프로그램 카운터를 설정하고에 테스트 프로그램을 실행파이썬 스레딩 : 인터프리터 셧다운 예외
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()
작품 OK :
다음은 테스트 케이스입니다.
@Wessie하지만 첫 번째 스레드가 종료 된 후 "processor.run_processor()"를 두 번째 호출하는 동안 "self.processor_thread = processor_thread()"줄에 새 스레드를 만들지 못합니까? – Bitrex
죄송합니다. 코드를 올바르게 읽지 못했습니다. 첫 번째 주석을 무시하십시오. – Wessie