Python线程的基本使用

实例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')

# 创建一个线程
# target 指定让线程执行的函数
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')

# 创建一个线程
# target 指定让线程执行的函数
t = threading.Thread(target=func, args=('PolarSnow',))
t.setDaemon(True) # 默认为False
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')

# 创建一个线程
# target 指定让线程执行的函数
t = threading.Thread(target=func, args=('PolarSnow',))
t.setDaemon(True) # 默认为False
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')

# 创建一个线程
# target 指定让线程执行的函数
t = threading.Thread(target=func, args=('PolarSnow',))
t.setDaemon(True) # 默认为False
t.start()
t.join(1) # 主线程停在这里
print('main end')

------------
func start
main end

设置为主线程在t.join这一行,最多等待1秒钟的时间,1秒钟之后,不管子线程有没有执行完毕都会继续向下执行