Portable Python 3.9.4 x64(Windows环境)中time.sleep引发线程退出的问题咨询
解决线程在
time.sleep后终止的问题 你的猜测方向是对的——主线程执行完毕后,虽然你设置了daemon=False(这也是默认值),但你没有让主线程等待子线程完成,导致程序整体退出。这里的关键是要让主线程显式等待所有子线程执行结束,另外你的代码里还有一个小bug需要修正。
第一步:修正代码中的变量引用错误
在run方法的print语句里,你写的是i,但这个i是全局循环变量,不是线程实例的self.i。当子线程延迟执行时,全局的i已经变化,会导致输出错误。应该改成self.i:
print("i: ", self.i,"j = ",j)
第二步:让主线程等待子线程完成
你已经初始化了threads列表,但没有把创建的线程对象添加进去,也没有调用join()方法来等待线程结束。修改后的完整代码如下:
import threading import time threads = [] print("hello") class myThread(threading.Thread): def __init__(self, i): threading.Thread.__init__(self) self.i = i def run(self): print("i = ", self.i) for j in range(0, self.i): print("i: ", self.i,"j = ",j) time.sleep(5) for i in range(1,4): thread = myThread(i) thread.daemon = False # 这行可以省略,因为默认就是False threads.append(thread) # 将线程添加到列表 thread.start() # 等待所有子线程完成 for thread in threads: thread.join()
原理说明
thread.join()方法会让调用它的线程(这里是主线程)阻塞,直到被调用的线程执行完毕。遍历所有子线程调用join(),就能保证主线程等所有子线程都跑完再退出。daemon=False的线程属于用户线程,Python解释器会等待所有用户线程结束后才会终止程序,但前提是主线程没有提前退出。如果主线程没做等待就结束,程序会直接终止,所有用户线程也会被强制停止——这就是你遇到的问题。
这样修改后,每个子线程都会完整执行完for循环里的所有迭代,包括time.sleep后的代码。
内容的提问来源于stack exchange,提问作者Benedikt Lindemann
相关产品推荐
相关产品推荐

