进程和线程相关

一、操作系统/应用程序

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密集型:多线程

  计算机密集型:多进程

原文地址:https://www.cnblogs.com/liaopeng123/p/9621044.html