Python并发编程 05 锁、同步条件、信号量、线程队列、生产者消费者模型

一、基础概念

①并发: 系统在一段时间内,处理多个任务的能力
②并行: 系统在同一时刻,处理多个任务的能力
③同步: 当进程执行到一个IO(等待外部数据)的时候,等待,不继续向下运行。
④异步: 当进程执行到一个IO(等待外部数据)的时候,不等待,而是先执行其他代码,一直到数据接收成功,再回来处理。
⑤GIL: 全局解释锁,是CPython解释器加的锁。不论有多少个CPU,在同一时刻,同一进程下,即使有多个线程,也只能有一个线程被执行。
⑥任务分两种: IO密集型和计算密集型。
  对于IO密集型的任务,python的多线程可以加快速度,也可以采用多进程+协程处理。
  对于计算密集型的任务,python的多线程反而因为切换的开销,增加处理时间。

二、同步锁

同步锁也叫互斥锁
(1)未加同步锁情形

import threading
import time

def sub():
    global num
    temp = num
    time.sleep(0.001)
    num = temp -1

num = 100

l = []

for i in range(100):
    t = threading.Thread(target=sub)
    t.start()
    l.append(t)

for t in l:
    t.join()

print(num)  # 98 输出结果不确定

上述代码中,各个线程在时间片轮转时,自己可能还没执行完,造成num值还未改变,就切换到其他线程了。所以num的值输出不固定(取决于cpu的执行速度)
(2)加同步锁情形

import threading
import time

def sub():
    global num
    lock.acquire() # 申请同步锁
    temp = num
    time.sleep(0.001)
    num = temp - 1
    lock.release() # 释放同步锁

num = 100

l = []
lock = threading.Lock() # 创建同步锁对象

for i in range(100):
    t = threading.Thread(target=sub)
    t.start()
    l.append(t)

for t in l:
    t.join()

print(num)  # 0

原线程在执行 lock.acquire() 后,线程不允许被切换去执行函数体内的代码,其他线程被阻塞在 **lock.acquire()**这句代码,原线程在执行 lock.release() 后,才允许切换线程。

三、线程死锁和递归锁

在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。这两个线程在无外力作用下将一直等待下去。例:

import threading
import time

class MyThread(threading.Thread):
    def actionA(self):
        A.acquire()
        print(self.name,"actionA gotA",time.strftime("%X"))
        time.sleep(1)

        B.acquire()
        print(self.name, "actionA gotB", time.strftime("%X"))
        time.sleep(1)

        B.release()
        A.release
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值