关于Threading中Lock的理解

关于Threading中Lock的理解

Lock的作用

刚开始接触python,对于线程中的锁不是很理解,错误的把Lock实现的效果当作Lock的作用。

  • Lock的效果是保证同一时间只有一个线程操作公共资源(全局变量),比如互斥锁,多个线程同时加同一个锁,只有该锁释放时,其他线程才能获取该锁。至于哪个线程先获取该锁是无序的,如下。
  • Lock的作用和效果不同,通过其不同的用法最终实现不同的效果。
    1. 锁对象(Lock)具有获取和释放两种状态,创建时处于释放状态。
    2. 默认创建的Lock具有阻塞作用,当Lock为一线程获取后,其他线程(包括其自身)若获取该锁,则线程阻止,不能往下运行,直到该锁释放。
    3. 若其他线程(包括自身)不获取该锁,则不发生阻塞作用,即阻塞作用发生在线程获取处于锁定状态的锁。
    4. 线程获取后的锁不一定必须释放,但若不释放,其他线程获取该锁时则发生死锁,程序假死。
互斥锁

两个线程使用同一个锁,只有一个线程运行结束后,另一个线程才能运行。

import threading
import time

total = 0
mutex = threading.Lock()


def sum_num(num):
    mutex.acquire() #获取锁
    for i in range(num):
        global total
        total += 1
    print(f'{threading.current_thread()}sum num is: {total}.')
    mutex.release() #释放锁

if __name__ == '__main__':
    thread_list = []
    for num in [1000000 for i in range(10)]:
        multi_thread = threading.Thread(target=sum_num,args=(num,),)
        multi_thread.start()
        thread_list.append(multi_thread)

    # 主线程等待子线程运行结束后运行打印
    for t in thread_list:
        t.join()
    print('total is:', total)

示例

创建两个线程,其中一个线程输出1-52,另外一个输出A-Z,要求输出的格式如下:

12A 34B 56C ..... 5152Z

使用一个锁
import threading, time

def num():
    for i in range(1,53,2):
        lock.acquire()
        print(str(i)+str(i+1), end='')

def alpha():
    for i in range(65, 91):
        time.sleep(0.000001)
        print(chr(i))
        lock.release()

if __name__ == '__main__':
    lock = threading.Lock()

    sn = threading.Thread(target=num)
    sa = threading.Thread(target=alpha)

    sn.start()
    sa.start()
使用多个锁
import threading, time
alpha_lock = threading.Lock()
num_lock = threading.Lock()

def print_num():
    num_lock.acquire() #先加锁,当输出2自己在获取锁时必须等待另一进程释放
    for i in range(1, 53, 2):

        print(str(i)+str(i + 1), end='')

        num_lock.acquire()
        alpha_lock.release()

def print_alpla():

    for w in range(ord('A'), ord('Z') + 1,):

        print(chr(w))

        num_lock.release()
        alpha_lock.acquire()


if __name__ == '__main__':
    num_thread = threading.Thread(target=print_num,)
    alpha_thread = threading.Thread(target=print_alpla)

    alpha_lock.acquire()
    num_thread.start()
    alpha_thread.start()

重点是进程再次获取自己已经获取到的锁时必须等待另一进程释放

收获
  • 遇到不懂的问题除了谷歌外,多看python文档,很可能是自己理解不到位。

转载于:https://my.oschina.net/u/4197529/blog/3098114

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值