Почему эти потоки демонов не убиваются? - PullRequest
0 голосов
/ 06 февраля 2019

Я узнал об обмене данными между потоками и наткнулся на эту другую проблему.Насколько я понимаю, потоки демона завершаются после завершения основного потока.Простой код ниже:

import threading
from time import sleep

def thread(Nr):
    global x
    lock.acquire()
    x = Nr
    print(x)
    sleep(4)
    print(x)
    lock.release()

    return 0

#################################################################################

x = 2
lock = threading.Lock()

for i in range(6):
    #print("Thread Nr: ", i)
    arg1 = i
    t = threading.Thread(target = thread, args = (arg1,), name = arg1)
    t.setDaemon(True)
    print("new thread started : %s" % (str(threading.current_thread().ident)))    
    t.start()
    sleep(1)

print("Main thread end")

Я запускаю 6 потоков, и это мой вывод в IDLE python 3.7.2:

new thread started : 940
0
new thread started : 940
new thread started : 940
new thread started : 940
new thread started : 9400

1
new thread started : 940
Main thread end
>>> 1
2
2
3
3
4
4
5
5

Итак, как вы можете видеть потокипродолжать работать после основного потока, даже если они deamonic.Одна интересная вещь, которую я обнаружил, заключается в том, что они ничего не печатают после «Конца основного потока», если они запускаются из windows cmd вместо IDLE.

Кто-нибудь знает, что здесь происходит?

Спасибо:)

1 Ответ

0 голосов
/ 06 февраля 2019

Они делают, но не в вашем IDLE.

Запуск вещей в вашем IDLE - это не то, на что вы должны полагаться.Важна ваша командная строка.Например, вы не можете использовать библиотеку Multiprocessing с вашим IDLE.

Что касается вашего IDLE, я считаю, что потоки продолжаются, потому что в оболочке (IDLE) вы фактически не завершаете свой скрипт / программу.Тот факт, что вы можете добавлять новые команды, показывает, что ваша программа все еще работает - в форме ожидания вашего следующего ввода.

Оболочка похожа на программу с (см. Ниже) в конце вашейscript

while True:
    exec(raw_input('>>> '))

Это означает, что ваш основной поток все еще работает, и независимо от того, установлен ли демон true или false, не имеет значения

Если вы хотите сами убедиться, добавьте посленапечатайте

exit(0)

и посмотрите, что получится

enter image description here

...