多线程原理
def f1(arg) print(arg) #单进程单线程的程序,好比后宫里面就一个慈宁宫 -- 主进程,一个王钢蛋 -- 线程
python中规定一个进程中只能有一个线程被cpu调度
这个的规定是因为python中一把锁:GIL,全局解释器锁
1、一个应用程序可以有多进程,可以有多进程
多进程,多线程目的是并发高,充分利用cpu
2、计算型操作占用cpu,使用多进程
io型操作不占用cpu,使用多线程
import time def f1(arg): time.sleep(5) print(arg) import threading #创建线程的模块都在这个模块中 t = threading.Thread(target=f1, args=(123,)) #target 让线程去做什么事,args 传递给f1函数的参数 t.start() #创建了一个线程已经准备好开始 ,还没有被cpu调度,什么时候被cpu调度还不知道 print("end") #默认主进程主线程运行到这里会等待,如果设置了t.setDaemon(True)就不等了
1.主线程 不等待子线程
t.setDaemon(True) #默认主线程等待子线程 t.setDaemon(False)
import time def f1(arg): time.sleep(5) print(arg) import threading #创建线程的模块都在这个模块中 t = threading.Thread(target=f1, args=(123,)) #target 让线程去做什么事,args 传递给f1函数的参数t.setDaemon(True) #主线程不成子线程执行完就结束了,导致子线程没有执行就结束了t.start() #创建了一个线程已经准备好开始 ,还没有被cpu调度,什么时候被cpu调度还不知道print("end") #默认主进程主线程运行到这里会等待,如果设置了t.setDaemon(True)就不等了
2.主线程还可以选择 等待子线程的位置
t.join()
import time def f1(arg): time.sleep(5) print(arg) import threading #创建线程的模块都在这个模块中 t = threading.Thread(target=f1, args=(123,)) #target 让线程去做什么事,args 传递给f1函数的参数 t.start() #创建了一个线程已经准备好开始 ,还没有被cpu调度,什么时候被cpu调度还不知道 print("end1") print("end2") print("end3") t.join(4) #主线程运行到此等待子线程执行完毕后再执行下面的4,5,6 join中的参数是最多等几秒, 这样执行到最后end6后主线程再等待子线程执行结果 print("end4") print("end5") print("end6")
如果我就是彻彻底底的不等了怎么办?
那我们就要将 join 和 setDaemon 一起使用了
import time def f1(arg): time.sleep(5) print(arg) import threading #创建线程的模块都在这个模块中 t = threading.Thread(target=f1, args=(123,)) #target 让线程去做什么事,args 传递给f1函数的参数 t.setDaemon t.start() #创建了一个线程已经准备好开始 ,还没有被cpu调度,什么时候被cpu调度还不知道 print("end1") print("end2") print("end3") t.join(4) #主线程运行到此等待子线程执行完毕后再执行下面的4,5,6 join中的参数是最多等几秒, 这样执行到最后end6后由于上面使用了t.setDaemon(True) 这时主线程也就不等子线程,直接结束了。 print("end4") print("end5") print("end6")
时间: 2024-10-12 13:23:27