Я пишу функцию Python, которая выполняет длительные вычисления. Вычисления нуждаются в тщательной отладке, поэтому моя идея состоит в том, чтобы сохранить состояние глобального состояния, чтобы иметь возможность просматривать его в IPython. Если это важно, состояние - это модель TensorFlow, а вычисление - это его обучение. (Исправление 1: на самом деле это не важно) Конечно, если я вижу, что тренировка проходит не очень хорошо, я не хочу ждать, пока она завершится, и нажимаю Ctrl + C в IPython в надежде просмотреть M.model
, внести некоторые исправления и т. Д.
К сожалению, если я попрошу IPython напечатать значение M
после исключения KeyboardInterrupt
, яНикого бы не увидел! Но как это может быть? Я почти уверен, что обучение уже началось, поэтому строка M=Model()
должна быть уже выполнена.
Исправление 2: Оказывается, важно загрузить файл в IPython, используя from test import *
синтаксис.
MCVE:
# Instructions
# 0. Save this program to test.py file.
# 1. Load the file in IPython with `from test import *` syntax
# 2. call `run()`, wait for some short time.
# 3. Interrupt it with Ctrl+C
# 4. See no global state changed
from typing import Any,Optional
from time import sleep
class Model:
state:Any
def train(m:Model)->None:
m.state = 0
print('Hit Ctrl+C to interrupt "training". Check out (the absence of) M.state')
while True:
m.state = m.state + 1
print('.', end='', flush=True)
sleep(1)
M:Optional[Model]=None
def run():
global M
M=Model()
train(M)