Поток демона сохраняется в ipython при запуске скрипта python - PullRequest
0 голосов
/ 11 сентября 2018

Рассмотрим следующие строки кода:

import time
import threading

keepAlive = True

def threadHandler():
    print('thread started')
    while keepAlive:
        time.sleep(1)
    print('thread ended')

tt = threading.Thread(name='SomeThread',target=threadHandler)
tt.setDaemon(True)
tt.start()

Если я скопирую и вставлю эти строки в ipython, тогда, когда захочу, я могу просто набрать keepAlive = False, чтобы завершить поток.Что хорошо!

Однако, если я сохраню приведенный выше код в файл с именем foo.py, а затем запусту его в ipython, выполнив %run foo.py, выполнение keepAlive = False в оболочке ipython не даст абсолютно никакого эффекта ипоток просто продолжает выполняться.Это как если бы у threadHandler() была собственная личная копия значения keepAlive, когда поток запускался.Есть ли способ решить эту проблему?

1 Ответ

0 голосов
/ 11 сентября 2018

1) Вы можете запустить скрипт в пространстве имен записной книжки, используя опцию -i. Смотрите это .

%run -i "foo.py"

2) Или получите код, а затем exec.

# Get the code as a string
fin = open("foo.py", "r")
code = fin.read()

# Execute the code
exec(code)

# Doing this in a cell in notebook terminates the thread
keepAlive = False
...