一、操作系统/应用程序
1、硬件
硬件包括硬盘、cpu、主板、显卡、内存、电源........
2、系统
系统就是由程序员写出来的软件,该软件用于控制计算机的硬件,让他们相互配合工作
3、安装软件(安装应用程序)
二、线程和进程
应用程序调用操作系统的线程和进程
单进程、多线程的应用程序
1 import threading 2 print('666') 3 4 def func(arg): 5 print(arg) 6 t = threading.Thread(target=func) #创建线程 7 t.start() 8 9 print('end') #主线程
一个应用程序(软件),可以有多个进程(默认只有一个),一个进程中可以创建多个线程(默认只有一个)
操作系统帮助开发者操作硬件
python在多线程和多进程的情况
1、多线程情况下
计算机密集型操作:效率低。(GIL锁)
IO操作:效率高
2、多进程的情况下
计算机密集型:效率高(浪费资源,不得已而为之)
IO操作:效率高
对于python进程和线程的选择:
计算机密集型:多进程
IO操作:多线程
3、GIL锁:是全局解释器锁。用于限制一个进程中同一个时刻只有一个线程被CPU处理
扩展:默认GIL锁在执行100个CPU指令(过期时间)
1 import sys 2 v1=sys.getcheckinterval() 3 print(v1) #100
三、在python中主线程和子线程的执行情况
1、主线程默认等待子线程执行
1 import time 2 def func(arg): 3 time.sleep(arg) 4 print(arg) 5 t1 = threading.Thread(target=func,args=(3,)) 6 t1.start() 7 t2 = threading.Thread(target=func,args=(9,)) 8 t2.start() 9 print(123)
# 打印结果 123,3,9
当把time.sleep(arg)去掉时打印结果:3,9,123
2、主线程不在等待子线程,主线程执行完毕则所有子线程终止(子线程在可以在主线程之前完成)
加上 子线程.setDaemon()
1 import time 2 def func(arg): 3 time.sleep(2) 4 print(arg) 5 6 t1 = threading.Thread(target=func,args=(3,)) 7 t1.setDaemon(True) #设置等待 8 t1.start() 9 10 t2 = threading.Thread(target=func,args=(9,)) 11 t1.setDaemon(True) 12 t2.start() 13 print(123)
3、开发者可以控制主线程等待子线程的时间(最多等待时间)
1 import time 2 def func(arg): 3 time.sleep(0.01) 4 print(arg) 5 6 print('创建子线程t1') 7 t1 = threading.Thread(target=func,args=(3,)) 8 t1.start() 9 # 无参数,让主线程在这里等着,等到子线程t1执行完毕,才可以继续往下走。 10 # 有参数,让主线程在这里最多等待n秒,无论是否执行完毕,会继续往下走。 11 t1.join(2) 12 13 print('创建子线程t2') 14 t2 = threading.Thread(target=func,args=(9,)) 15 t2.start() 16 t2.join(2) # 让主线程在这里等着,等到子线程t2执行完毕,才可以继续往下走。 17 18 print(123)
当超过等待时间子线程未执行完成,主线程继续往下走,当主线程执行完毕后会继续执行未执行完的子线程,这时主线程才算执行完毕
4、获取线程名称
1 def func(arg): 2 t=threading.current_thread()# 获取当前线程信息 3 name=t.getName() #获取当前线程名称 4 print(name) 5 6 t1 = threading.Thread(target=func,args=(3,)) 7 t1.setName("线程1") 8 t1.start() 9 10 t2 = threading.Thread(target=func,args=(9,)) 11 t2.setName("线程2") 12 t2.start() 13 14 print(123)
5、线程本质
1 def func(arg): 2 t=threading.current_thread()# 获取当前线程信息 3 name=t.getName() #获取当前线程名称 4 print(name) 5 6 t1 = threading.Thread(target=func,args=(3,)) 7 t1.setName("线程1") 8 t1.start() #不是执行线程,而是告诉cpu可以被调度了 9 print(123)
这个需要根据CPU的情况而定
总结:
1、线程是CPU工作的最小单元,创建线程是为了利用多核优势实现操作
2、创建进程是为了做数据隔离,进程是为了提供环境让线程工作
3、在python中存在一个GIL锁
影响:多线程无法利用多核优势
解决:创建多进程
4、IO密集型:多线程
计算机密集型:多进程