在Python中正确终止线程

时间:2018-04-09 12:55:20

标签: python python-3.x python-3.6

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

除非我尝试在脚本末尾放置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

1 个答案:

答案 0 :(得分:1)

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

一般来说,最好让一个线程单独停止,而不是强行杀死它,所以你通常会用一个标志来杀死这种线程。尝试将结尾处的段更改为:

killflag = False
start()
killflag = True
input("Complete...")

并将进度方法更新为:

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