在Python中正确终止线程

在Python中正确终止线程,python,python-3.x,python-3.6,Python,Python 3.x,Python 3.6,我不太熟悉线程,可能没有正确使用它,但我有一个脚本,可以运行几次speedtest并打印平均值。我试图使用线程来调用一个函数,该函数在测试运行时显示一些内容 一切正常,除非我尝试在脚本末尾放置input(),以保持控制台窗口打开。它使线程连续运行。 我在寻找正确终止线程的方向。也有更好的方法可以做到这一点 import speedtest, time, sys, datetime from threading import Thread s = speedtest.Speedtest() be

我不太熟悉线程,可能没有正确使用它,但我有一个脚本,可以运行几次speedtest并打印平均值。我试图使用线程来调用一个函数,该函数在测试运行时显示一些内容

一切正常,除非我尝试在脚本末尾放置input(),以保持控制台窗口打开。它使线程连续运行。
我在寻找正确终止线程的方向。也有更好的方法可以做到这一点

import speedtest, time, sys, datetime
from threading import Thread

s = speedtest.Speedtest()
best = s.get_best_server()

def downloadTest(tries):
    x=0
    downloadList = []
    for x in range(tries):
        downSpeed = (s.download()/1000000)
        downloadList.append(downSpeed)
        x+=1
        results_dict = s.results.dict()
    global download_avg, isp
    download_avg = (sum(downloadList)/len(downloadList))
    download_avg = round(download_avg,1)
    isp = (results_dict['client']['isp'])
    print("")
    print(isp)
    print(download_avg)

def progress():
    while True:
        print('~ ',end='', flush=True)
        time.sleep(1)


def start():
    now=(datetime.datetime.today().replace(microsecond=0))            
    print(now)
    d = Thread(target= downloadTest, args=(3,))
    d.start()
    d1 = Thread(target = progress)
    d1.daemon = True
    d1.start()
    d.join()

start()
input("Complete...") # this causes progress thread to keep running

线程没有退出的理由,这就是为什么它不会终止。守护进程线程通常在您的程序(所有其他线程)终止时终止,这不会发生,因为最后一个输入没有退出

一般来说,让线程自行停止是一个好主意,而不是强制终止它,因此通常使用标志终止此类线程。尝试将末端的线段更改为:

killflag = False
start()
killflag = True
input("Complete...")
并将进度方法更新为:

def progress():
    while not killflag:
        print('~ ',end='', flush=True)
        time.sleep(1)

你是故意不在d结束后杀死d1吗?我将d1设置为一个守护进程,这样它在d结束时终止。如果没有最后一行上的输入,它将正确执行此操作。我如何故意正确终止d?
d
将正确终止,因为您正在加入它,并且它不是无限循环。如果在完成时键入一些输入并点击return,程序是否会按预期终止?或者它在输入语句后被卡住了,打印过程永远是d1?在我输入一些东西后它确实停止了。我想这是有道理的。我的目标是在测试完成后保持控制台打开,这就完成了。多谢各位