最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python中线程互斥锁是什么

    正文概述    2020-05-26   437

    Python中线程互斥锁是什么

    线程互斥锁

    1.线程互斥锁介绍

    当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制,线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。

    互斥锁为资源引入一个状态:锁定/非锁定

    某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

    Python中线程互斥锁是什么

    threading模块中定义了Lock类,可以方便的处理锁定:

    #创建锁
    mutex = threading.Lock()
    #锁定
    mutex.acquire([blocking])
    #释放
    mutex.release()

    其中,锁定方法acquire可以有一个blocking参数。

    如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True)。

    如果设定blocking为False,则当前线程不会堵塞。

    使用互斥锁实现上面的例子的代码如下:

    from threading import Thread, Lock
    import time
    g_num = 0
    def test1():
        global g_num
        for i in range(1000000):
            #True表示堵塞 即如果这个锁在上锁之前已经被上锁了,那么这个线程会在这里一直等待到解锁为止 
            #False表示非堵塞,即不管本次调用能够成功上锁,都不会卡在这,而是继续执行下面的代码
            mutexFlag = mutex.acquire(True) 
            if mutexFlag:#锁住
                g_num += 1
                mutex.release()#解锁
        print("---test1---g_num=%d"%g_num)
    def test2():
        global g_num
        for i in range(1000000):
            mutexFlag = mutex.acquire(True) #True表示堵塞
            if mutexFlag:#锁住
                g_num += 1
                mutex.release()#解锁
        print("---test2---g_num=%d"%g_num)
    #创建一个互斥锁
    #这个所默认是未上锁的状态
    mutex = Lock()
    p1 = Thread(target=test1)
    p1.start()
    p2 = Thread(target=test2)
    p2.start()
    time.sleep(5)
    print("---g_num=%d---"%g_num)

    运行结果为:

    ---test1---g_num=1942922
    ---test2---g_num=2000000
    ---g_num=2000000---

    相关推荐:《Python视频教程》

    2.上锁解锁过程

    当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。

    每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“阻塞”,直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。

    线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。

    锁的好处:

    确保了某段关键代码只能由一个线程从头到尾完整地执行

    锁的坏处:

    阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了

    由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁

    3.死锁

    在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。

    尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子:

    #coding=utf-8
    import threading
    import time
    class MyThread1(threading.Thread):
        def run(self):
            if mutexA.acquire():
                print(self.name+'----do1---up----')
                time.sleep(1)
                if mutexB.acquire():
                    print(self.name+'----do1---down----')
                    mutexB.release()
                mutexA.release()
    class MyThread2(threading.Thread):
        def run(self):
            if mutexB.acquire():
                print(self.name+'----do2---up----')
                time.sleep(1)
                if mutexA.acquire():
                    print(self.name+'----do2---down----')
                    mutexA.release()
                mutexB.release()
    mutexA = threading.Lock()
    mutexB = threading.Lock()
    if __name__ == '__main__':
        t1 = MyThread1()
        t2 = MyThread2()
        t1.start()
        t2.start()

    运行结果为:

    Thread-1----do1---up----
    Thread-2----do2---up----

    此时已经进入到了死锁状态

    Python中线程互斥锁是什么

    4.避免死锁

    程序设计时要尽量避免(银行家算法)

    添加超时时间等

    相关推荐:

    Python进程锁Lock是什么


    下载网 » Python中线程互斥锁是什么

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元