一、并发、并行
- 并发:指的是同一时间段内,可以执行多个任务的能力。在并发情况下,指令执行的先后顺序有内核指定,或通过竞争的方式拿到cpu的执行权,一端时间之后切换到另一个任务进行执行,因为速度太快从而实现并发的效果。
- 并行:指定是同一时间,同时执行多个任务的能力。并行是充分利用计算机多核的优势,让多个指令同时执行。
所以说,并发编码可以提高程序的执行效率。
二、进程和线程
-
进程:是程序,资源集合,进程控制块组成,是最小的资源单位
- 特点:就对Python而言,可以实现真正的并行效果
- 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦
-
线程:是进程中最小的执行单位。
- 特点无法利用多核,无法实现真正意义上是并行效果。
- 优点:对于IO密集型的操作可以很好利用IO阻塞的时间
三、多线程
多线程相当于一个并发(concunrrency)系统。并发系统一般同时执行多个任务。如果多个任务可以共享资源,特别是同时
写入某个变量的时候,就需要解决同步的问题,比如多线程火车售票系统:两个指令,一个指令检查票是否卖完,另一个指令,多
个窗口同时卖票,可能出现卖出不存在的票。
实现多线程方法一:
1 "--wallace--" 2 import threading 3 import time 4 def fun(num): #定义线程执行函数 5 print("this is fun %d" % num,time.ctime()) 6 time.sleep(3) 7 print("this is fun %d" % num,time.ctime()) 8 9 if __name__ == "__main__": 10 t1 = threading.Thread(target=fun,args=(1,)) #实例化线程对象:target 线程执行对象,args:参数 11 t2 = threading.Thread(target=fun,args=(2,)) 12 t1.start() #使线程处于就绪状态 13 t2.start() 14 print("ending") 15 16 ''' 17 一个进程至少有一个线程即主线程。上面的t1和t2都是主线程创建的子线程。 18 进程:一个程序在一堆数据集上执行的过程:最小的资源单位 19 线程:最小的执行单位 20 '''
实现多线程方法二:
1 import threading 2 import time 3 4 class Mythreding(threading.Thread): 5 def __init__(self,num): 6 threading.Thread.__init__(self) 7 self.num = num 8 def run(self): #重构方法,用于线程调用 9 print("this is %s" % self.num) 10 time.sleep(self.num) 11 12 if __name__ == "__main__": 13 t1 = Mythreding(2) 14 t2 = Mythreding(3) 15 t1.start() 16 t2.start()
全局解释器锁(GIL):
是python的解释器cpython引入的概念,并不是python语言是概念。它使得无论有多少个cpu都只允许有一个线程执行。
GIL是应用在进程中的,确保进程中的多个线程只有一个线程可以进入cpu进行执行。线程的执行顺序是相互竞争的。