实例1 start
创建子线程并执行线程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import threading import time
def func(arg): print('func start') time.sleep(2) print(arg) print('func end')
t = threading.Thread(target=func, args=('PolarSnow',)) t.start()
print('main end')
------------ func start main end PolarSnow func end
|
上面的代码在主线程中创建了一个子线程去执行一个函数
执行这个函数最少需要2秒钟,而主线程直接去执行了print('end')
,说明在默认情况下,主线程不会等待子线程直接结束再向下执行,而是主线程先向下执行,即使主线程所有代码已经执行完毕,也不会退出程序,而是等待所有子线程执行结束后再退出程序
实例2 setDaemon
设置主线程不等待子线程执行完毕
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import threading import time
def func(arg): print('func start') time.sleep(2) print(arg) print('func end')
t = threading.Thread(target=func, args=('PolarSnow',)) t.setDaemon(True) t.start()
print('main end')
------------ func start main end
|
在启动线程之前设置t.setDaemon(True)
为True,意思是主线程不会等待所有的子线程执行完毕再退出程序,而是当主线程执行完毕后,强制退出程序,不管子线程有没有执行完毕
实例3 join
主线程等待子线程执行完毕后,再向下执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import threading import time
def func(arg): print('func start') time.sleep(2) print(arg) print('func end')
t = threading.Thread(target=func, args=('PolarSnow',)) t.setDaemon(True) t.start() t.join() print('main end')
------------ func start PolarSnow func end main end
|
使用了join方法之后,主线程会一直停在join方法那一行,直到所有的子线程都执行完毕后,再继续向下执行
实例4 join(1)
设置主线程再次等待子线程的最大时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import threading import time
def func(arg): print('func start') time.sleep(2) print(arg) print('func end')
t = threading.Thread(target=func, args=('PolarSnow',)) t.setDaemon(True) t.start() t.join(1) print('main end')
------------ func start main end
|
设置为主线程在t.join
这一行,最多等待1秒钟的时间,1秒钟之后,不管子线程有没有执行完毕都会继续向下执行