用python演示一种死锁的产生

搞多线程的经常会遇到死锁的问题,学习操作系统的时候会讲到死锁相关的东西,我们用python直观的演示一下。

死锁的一个原因是互斥锁。假设银行系统中,用户a试图转账100块给用户b,与此同时用户b试图转账200块给用户a,则可能产生死锁。

2个线程互相等待对方的锁,互相占用着资源不释放。

#coding=utf-8
import time
import threading
class Account:
    def __init__(self, _id, balance, lock):
        self.id = _id
        self.balance = balance
        self.lock = lock

    def withdraw(self, amount):
        self.balance -= amount

    def deposit(self, amount):
        self.balance += amount

def transfer(_from, to, amount):
    if _from.lock.acquire():#锁住自己的账户
        _from.withdraw(amount)
        time.sleep(1)#让交易时间变长,2个交易线程时间上重叠,有足够时间来产生死锁
        print 'wait for lock...'
        if to.lock.acquire():#锁住对方的账户
            to.deposit(amount)
            to.lock.release()
        _from.lock.release()
    print 'finish...'

a = Account('a',1000, threading.Lock())
b = Account('b',1000, threading.Lock())
threading.Thread(target = transfer, args = (a, b, 100)).start()
threading.Thread(target = transfer, args = (b, a, 200)).start()
时间: 2024-11-03 21:04:46

用python演示一种死锁的产生的相关文章

Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池

目录 Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池 1.昨日回顾 2.死锁现象与递归锁 2.1死锁现象 2.2递归锁 3.信号量 4.GIL全局解释器锁 4.1背景 4.2为什么加锁 5.GIL与Lock锁的区别 6.验证计算密集型IO密集型的效率 6.1 IO密集型 6.2 计算密集型 7.多线程实现socket通信 7.1服务端 7.2客户端 8.进程池,线程池 Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池 1.昨日回顾 #生产者消

fakeLoader页面加载前loading演示8种效果

提高用户体验的插件fakeLoader页面加载前loading演示8种效果 在线预览 下载地址 示例代码 <div id="main"> <div class="demo"> <a href="/api/jq/5733e326a88fd/index.html" class="cur">Spinner1 </a> <a href="/api/jq/5733e326a

liMarquee演示12种不同的无缝滚动效果

很实用的一款liMarquee演示12种不同的无缝滚动效果 在线预览 下载地址 实例代码 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <title>liMarquee演示12种不同的无缝滚动效果-默认效果_sucaihuo</title> <link rel="stylesheet"

帮你提升 Python 的 27 种编程语言

以下为正文: 作为全球最流行的编程语言联合设计者之一,我经常看到的一种令人沮丧的行为(在Python社区和其它社区都有),就是那些有影响力的人试图把“缺失”的恐惧感灌输给其它开源社区,将其当作对社区贡献的源动力.(我偶尔会对自己的这种不当行为感到内疚,当别人落入同样的陷阱时我也就更容易察觉到). 虽然借鉴其他编程语言社区的经验是一件好事,但以恐惧为基础的方法来激励行动存在严重的问题,因为它将助涨社区成员为争取贡献者的关注而将其它社区的成员视为敌人,而不是当做潜在的盟友去迎接更大的挑战,共同推动顶

Xslider演示8种滚动效果

Xslider演示8种滚动效果包括: 一.左右切换:每次移动固定距离 二.左右切换:最后一个显示在最右侧 三.自动切换 四.循环切换 五.文本的上下滚动 六.上下切换 七.上下自动循环切换 在线预览 下载地址 在线实例 <h2>七.上下自动循环切换</h2> <div class="newslistwraper"> <div class="newslist"> <ul> <li>日本通过防卫大纲

排序算法视频 《6 分钟演示 15 种排序算法》

排序算法视频 <6 分钟演示 15 种排序算法> 而且在 github 开源的. https://github.com/bingmann/sound-of-sorting 有声音,而且很直观. http://panthema.net/2013/sound-of-sorting/ 原文地址:https://www.cnblogs.com/F4NNIU/p/9798722.html

Python中几种数据类型list, tuple,dict,set的使用演示

还是直接上代码,看着代码运行,看函数介绍 # coding=utf-8 # 1 list-列表 的用法 students = [1,2,3] a = 5 classmates = [students*2,[1,1,1,1],[1,1,1,1]]#list的乘法是数组的线性扩大 classmates.append('test' ) #list的附加 classmates.extend(students) #迭代扩展list print(classmates.index('test',2)) #li

python 并发编程 多线程 死锁现象与递归锁

一 死锁现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁 from threading import Thread from threading import Lock import time # 实例化两把不同的锁 mutexA = Lock() mutexB = Lock() class MyThread(Threa

Python的两种运行方式

从2015年5月19日注册博客园,立志于要通过写博客的方式,记录自己编程的点点滴滴,由于自己太懒,一直拖到现在,“拖延症”是病得改,今天终于写自己第一篇博客了,有点小激动! Python是由Guido van Rossum于1989年底发明的,1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承.之所以选中Python(大蟒蛇的意思)作为程序的名字,是因为他是一个叫Monty Python的喜剧团体的爱好者.国外人就是任性,