1. 守护线程
- 使用setDaemon(True)把所有的子线程都变成了主线程的守护线程,因此当主进程结束后,子线程也会随之结束。所以当主线程结束后,整个程序就退出了。
- 把子进程设置为守护线程,必须在start()之前设置。
- 为了让守护线程执行结束之后,主线程再结束,我们可以使用join方法,让主线程等待子线程执行
- join()在start()之后。
#!/usr/bin/env python
# coding:utf-8
import threading
import time
def run(n):
print(f'task {n}')
time.sleep(1)
print('2s')
time.sleep(1)
print('1s')
time.sleep(1)
print('0s')
time.sleep(1)
if __name__ == '__main__':
t1 = threading.Thread(target=run, args=('t1',))
t1.setDaemon(True) # 把子进程设置为守护线程,必须在start()之前设置
t1.start()
t1.join() # 设置主线程等待子线程结束
print('main thread end.')
2. 多线程共享全局变量
- 线程是进程的执行单元,进程是系统分配资源的最小单位,所以在同一个进程中的多线程是共享资源的。
#!/usr/bin/env python
# coding:utf-8
import threading
import time
global_num = 100
def work1():
global global_num
for i in range(3):
global_num += 1
print(f'in work1 global_num is :{global_num}')
def work2():
global global_num
print(f'in work2 global_num is {global_num}')
if __name__ == '__main__':
t1 = threading.Thread(target=work1)
t1.start()
time.sleep(1)
t2 = threading.Thread(target=work2)
t2.start()
# output:
in work1 global_num is :103
in work2 global_num is 103