python多线程编程4: 死锁和可重入锁

死锁

在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子:

# encoding: UTF-8import threadingimport time  class MyThread(threading.Thread):    def do1(self):        global resA, resB        if mutexA.acquire():             msg = self.name+' got resA'             print msg                            if mutexB.acquire(1):                 msg = self.name+' got resB'                 print msg                 mutexB.release()             mutexA.release()    def do2(self):        global resA, resB        if mutexB.acquire():             msg = self.name+' got resB'             print msg                            if mutexA.acquire(1):                 msg = self.name+' got resA'                 print msg                 mutexA.release()             mutexB.release()             def run(self):        self.do1()        self.do2()resA = 0resB = 0  mutexA = threading.Lock()mutexB = threading.Lock()  def test():    for i in range(5):        t = MyThread()        t.start()if __name__ == '__main__':    test()

登录后复制

执行结果:

Thread-1 got resA

Thread-1 got resB

立即学习“Python免费学习笔记(深入)”;

Thread-1 got resB

立即学习“Python免费学习笔记(深入)”;

Thread-1 got resA

Thread-2 got resA

Thread-2 got resB

Thread-2 got resB

Thread-2 got resA

Thread-3 got resA

Thread-3 got resB

Thread-3 got resB

Thread-3 got resA

Thread-5 got resA

Thread-5 got resB

Thread-5 got resB

Thread-4 got resA

此时进程已经死掉。

可重入锁

更简单的死锁情况是一个线程“迭代”请求同一个资源,直接就会造成死锁:

import threadingimport time  class MyThread(threading.Thread):    def run(self):        global num        time.sleep(1)          if mutex.acquire(1):             num = num+1            msg = self.name+' set num to '+str(num)            print msg            mutex.acquire()            mutex.release()            mutex.release()num = 0mutex = threading.Lock()def test():    for i in range(5):        t = MyThread()        t.start()if __name__ == '__main__':    test()

登录后复制

为了支持在同一线程中多次请求同一资源,python提供了“可重入锁”:threading.RLock。RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:

import threadingimport time  class MyThread(threading.Thread):    def run(self):        global num        time.sleep(1)          if mutex.acquire(1):             num = num+1            msg = self.name+' set num to '+str(num)            print msg            mutex.acquire()            mutex.release()            mutex.release()num = 0mutex = threading.RLock()def test():    for i in range(5):        t = MyThread()        t.start()if __name__ == '__main__':    test()

登录后复制

执行结果:

Thread-1 set num to 1

Thread-3 set num to 2

Thread-2 set num to 3

Thread-5 set num to 4

Thread-4 set num to 5

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2284498.html

(0)
上一篇 2025年2月27日 20:46:43
下一篇 2025年2月23日 16:31:53

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python多线程编程3: 使用互斥锁同步线程

    问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系。现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1。很容易写出这样的代码: # encoding: UTF-…

    编程技术 2025年2月27日
    200
  • Python多线程抓取Google搜索链接网页

    1)urllib2+beautifulsoup抓取goolge搜索链接 近期,参与的项目需要对Google搜索结果进行处理,之前学习了Python处理网页相关的工具。实际应用中,使用了urllib2和beautifulsoup来进行网页的抓…

    2025年2月27日
    200
  • python多线程编程2

    如上一节,python的threading.thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法。而创建自己的线程实例后,通过thread类的start方法,可以启动该线程,交给python虚拟机进行调度,…

    编程技术 2025年2月27日
    200
  • python多线程编程1

    多线程编程必须理解的一些基本概念,适用于所有编程语言。内容: 并发式编程 多任务操作系统 多线程vs多进程 线程安全 立即学习“Python免费学习笔记(深入)”; 线程的生命周期 线程的类型 并发式编程 不同的编程范式对软件有不同的视角。…

    编程技术 2025年2月27日
    200
  • Python多线程异步任务队列

    很多场景为了不阻塞,都需要异步回调机制。这是一个简单的例子。 python的多线程异步常用到queue和threading模块 #!/usr/bin/env python# -*- coding: UTF-8 -*-  import log…

    编程技术 2025年2月27日
    200
  • python实现douban.fm简易客户端

    一个月前心血来潮用python实现了一个简单的douban.fm客户端,计划是陆续将其完善成为ubuntu下可替代web版本的douban.fm客户端。但后来因为事多,被一直搁着,没有再继续完善。就在昨天,一位园友在评论中提到了登录的实现,…

    2025年2月27日
    200
  • 关于python线程学习记录

    引言&动机 考虑一下这个场景,我们有10000条数据需要处理,处理每条数据需要花费1秒,但读取数据只需要0.1秒,每条数据互不干扰。该如何执行才能花费时间最短呢? 在多线程(MT)编程出现之前,电脑程序的运行由一个执行序列组成,执行…

    2025年2月27日
    200
  • python多线程之thread的详细介绍

    这篇文章分享python多线程之thread的详细介绍 python 多线程之thread #! /usr/bin/env python# -*- coding:utf-8 -*-from threading import Threadim…

    编程技术 2025年2月27日
    200
  • 使用Python多线程实例详解

    这篇文章主要介绍了Python 多线程实例详解的相关资料,需要的朋友可以参考下 Python 多线程实例详解 多线程通常是新开一个后台线程去处理比较耗时的操作,Python做后台线程处理也是很简单的,今天从官方文档中找到了一个Demo. 实…

    编程技术 2025年2月27日
    200
  • python学习之面向对象编程特性(二)

    面向对象程序设计中的术语对象(object)基本上可以看做数据(特性)以及由一系列可以存取、操作这些数据的方法所组成的集合。传统意义上的“程序=数据结构+算法”被封装”掩盖“并简化为“程序=对象+消息”。对象是类的实例,类的抽象则需要经过封…

    2025年2月27日
    200

发表回复

登录后才能评论