Потоки демонов в Jupyter Notebook не останавливаются - PullRequest
0 голосов
/ 12 мая 2019

Я создаю учебник для моего класса по многопоточности. У меня есть этот простой код ниже, который инициализирует 3 потока. Нить 1,2,3.

Тема 1: простой таймер, который ждет 4 секунды

Тема 2: простой таймер, который ждет 2 секунды

Поток 3: простой таймер, который ждет 6 секунд, но является демоном.

Основная программа заканчивается до окончания 3-го потока. Поскольку 3-й поток был deamon, я думал, что он будет убит. Таким образом, мне интересно, что не так с моим кодом или с блокнотом jupyter. Вот мой код.

import threading
import logging
import time

def threadLauncher1(name, delay):
    logging.info("Thread %s \t : Starting" %name)
    time.sleep(delay)
    logging.info("Thread %s \t : Finishing" %name)


class threadLauncher2(threading.Thread):
    def __init__(self, name, delay):
        super().__init__()
        self.name = name
        self.delay = delay

    def run(self):
        logging.info("Thread %s \t : Starting" % self.name)
        time.sleep(self.delay)
        logging.info("Thread %s \t : Finishing" % self.name)


if __name__ == "__main__":

    format = "%(asctime)s: %(message)s"
    logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")

    threadLauncherFunction1 = threading.Thread(target=threadLauncher1, args=("Timer 1", 4,))
    threadLauncherFunction1.start()

    threadLauncherFunction2 = threadLauncher2("Timer 2", 2)
    threadLauncherFunction2.start()

    threadLauncherFunction3 = threadLauncher2("Timer 3", 6)
    threadLauncherFunction3.setDaemon(True)
    threadLauncherFunction3.start()

    logging.info("Daemon setting is %s on %s" % (str(threadLauncherFunction3.isDaemon()), threadLauncherFunction3.name))

    threadLauncherFunction1.join()
    logging.info("Waited until Timer 1 had finished")
    logging.info("Timer3 should not be able to finish, since it is a daemon Thread")

Я попытался заменить третий поток более явной функцией.

class threadLauncher3(threading.Thread):
    def __init__(self, name, delay):
        super().__init__()
        self.name = name
        self.delay = delay

    def run(self):
        while True:
            logging.info('Thread %s running.' %self.name)
            time.sleep(self.delay)

Как и ожидалось из предыдущих результатов, выходное значение:

13:19:37: Thread Timer 1     : Starting
13:19:37: Thread Timer 2     : Starting
13:19:37: Thread Timer 3 running.
13:19:37: Daemon setting is True on Timer 3
13:19:38: Thread Timer 3 running.
13:19:39: Thread Timer 2     : Finishing
13:19:39: Thread Timer 3 running.
13:19:40: Thread Timer 3 running.
13:19:41: Thread Timer 1     : Finishing
13:19:41: Waited until Timer 1 had finished
13:19:41: Timer3 should not be able to finish, since it is a daemon Thread
13:19:41: Thread Timer 3 running.
13:19:42: Thread Timer 3 running.
13:19:43: Thread Timer 3 running.
To infinity

Эти два кода отлично работают на интерпретаторе моего компьютера.

...