进程是存储数据的空间,而线程是cpu执行的指令。就好比进程是一个房间,线程就是房间中的每一个人。所以每一个进程都必定包含至少一个线程。进程和线程是相对独立的,但又是相互依赖的。当主线程执行完毕后,子线程随即停止。
话不多说,直接上代码!!!
import threading, time
def run(n):
print('task start', n)
time.sleep(2)
print('task end', n, threading.current_thread())
start_time = time.time()
t_obj = [] # 存线程实例
for i in range(50):
t = threading.Thread(target=run, args=('t-%s' %i, ))
t.setDaemon(True) # 把当前进程设置为守护进程,主线程执行完毕,子线程均停止
t.start()
t_obj.append(t)
# 设置join,主线程等待所有子线程执行完毕才退出
# for t in t_obj:
# t.join()
time.sleep(2)
print('-'*30 + 'all threads has finished...', threading.current_thread(), threading.active_count())
print('cost time', time.time() - start_time)
1.使用join函数之后,主线程等待所有子线程执行完毕后退出。
task start t-0
task start t-1
task start t-2
task start t-3
task start t-4
task start t-5
task start t-6
task start t-7
task start t-8
task start t-9
task end t-1
task end t-0
task end t-2
task end t-4
task end t-3
task end t-5
task end t-6
task end t-9
task end t-7
task end t-8
------------------------------all threads has finished... <_MainThread(MainThread, started 9996)> 1
cost time 4.005229234695435
可以看到,当子线程全部执行完毕以后,主线程才结束。
2.使用setDaemon函数之后,子线程设置为守护线程,一旦主线程执行完毕,子线程随即停止。
task start t-0
task start t-1
task start t-2
task start t-3
task start t-4
task start t-5
task start t-6
task start t-7
task start t-8
task start t-9
------------------------------all threads has finished... <_MainThread(MainThread, started 10500)> 11
cost time 0.006000518798828125
可以看到,当主线程结束时,子线程随之停止。
tips:主线程运行速度快于子线程。