关于Threading中Lock的理解

IT教程 3年前 (2020) https://www.55wd.com

iiyi

关于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

微信朋友圈年中数据报告在哪看 2018微信年终数据报告

微信年中数据报告近日在朋友圈中疯狂的刷屏当中,很多用户对此报告还是很关心的,那么微信年中数据报告怎么看在哪看?2018微信年终数据

excel中解二元一次方程的方法步骤

Excel中的二元一次方程具体该如何解决呢?下面是豌豆资源网小编带来的关于excel中解二元一次方程的方法,希望阅读过后对你有所启发!

一次修改上百个表格,Word中批量修改所有表格格式样式

我们在使用Word排版编写书籍时候,可能会带有许多表格,上百,甚至上千个表格都是有可能的。这么多的表格对于后期的样式修改是非常不利

【解决】当前操作环境不支持支付宝控件/一直处于“正

当前操作环境不支持支付宝控件 这种情况多发生在windows10的环境下,参考 解决办法! 这个问题解决了,可是太悲剧了,你的电脑可能又出现

[POI2008]BLO-Blockade

题目描述在Byteotia有n个城镇。 一些城镇之间由无向边连接。 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些)

文章回顾

大家看了本文关于Threading中Lock的理解的精彩教程资源内容,是不是对关于Threading中Lock的理解了解更多,真心希望关于Threading中Lock的理解能帮助到你, 小编会一直给你带来更多教程资源文章信息。

版权声明: 发表于 2020-12-05 23:44:17。

本文由第三方用户分享仅代表作者观点,不代表本网站立场,秉承互联网开放分享的精神,目的在于传递更多信息,加强各行业互通交流,但对内容不作任何保证或承诺,请读者自行参考斟酌。网站发布的信息(包含但不限于版式、图片、字体、文章等素材)由第三方用户分享,版权归原作者所有,本站不承担任何相关的版权纠纷等相关责任。如您认为本篇内容侵犯了您的权益,请与我们联系,我们会及时处理。

豌豆资源网专注分享全网综合资源网站大全,致力于超实用的内容资源搜索。

转载请注明:
本文标题:关于Threading中Lock的理解
本文地址:https://www.55wd.com/s181855/