Python 全栈开发十二 并发编程多线程多进程

时间:2021-03-01 16:42:21

一、并发、并行

  1. 并发:指的是同一时间段内,可以执行多个任务的能力。在并发情况下,指令执行的先后顺序有内核指定,或通过竞争的方式拿到cpu的执行权,一端时间之后切换到另一个任务进行执行,因为速度太快从而实现并发的效果。
  2. 并行:指定是同一时间,同时执行多个任务的能力。并行是充分利用计算机多核的优势,让多个指令同时执行。

  所以说,并发编码可以提高程序的执行效率。

二、进程和线程

  • 进程:是程序,资源集合,进程控制块组成,是最小的资源单位
    • 特点:就对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进行执行。线程的执行顺序是相互竞争的。