homework-thread-5个账户存取款

守护线程(守护进程)—> ???

10个线程竞争一个银行账户!!!

多个线程竞争一个资源的场景 —> 线程锁(threading.Lock)/ 线程调度(threading.Condition)

from concurrent.futures import ThreadPoolExecutor
import threading
import random
import time


class Account:
    
    def __init__(self, lock):
        self.lock = lock
        self.balance = 1000
        self.investing = 0
        
    def update_balance(self, change):
        self.lock.acquire()
        if self.balance + change >= 0:
            time.sleep(0.1)
            self.balance += change
            self.lock.release()
            return True
        self.lock.release()
        return False
    
    def invest(self):
        investing = self.balance * 0.1 // 1
        if investing > 0:
            self.investing += investing
            self.balance -= investing

            
class User_account(Account):
    
    def __init__(self):
        super().__init__(lock=None)
        self.balance = 0
        
    def deposit(self, money, bank):
        if bank.update_balance(money):
            time.sleep(0.1)
            self.balance += money
        else:
            print('bank cash flow interruption')
    
    def withdraw(self, money, bank):
        balance = self.balance - money
        if balance >= 0 and bank.update_balance(-money):
            time.sleep(0.1)
            self.balance = balance
            
    def update_balance(self, change):
        pass

    
def choose_action(user, bank):
    actions = ['deposit', 'withdraw']
    action = random.choice(actions)
    if action == 'deposit':
        user.deposit(random.randint(1, 5)*100, bank)
    elif action == 'withdraw':
        user.withdraw(random.randint(5, 20)*100, bank)

        
def group_behavior(bank, u1, u2, u3, u4, u5):
    with ThreadPoolExecutor(max_workers=10) as pool:
        pool.submit(bank.invest)
        pool.submit(choose_action, u1, bank)
        pool.submit(choose_action, u2, bank)
        pool.submit(choose_action, u3, bank)
        pool.submit(choose_action, u4, bank)
        pool.submit(choose_action, u5, bank)

        
def transaction(ntimes):
    lock = threading.Lock()
    bank = Account(lock)
    user1 = User_account()
    user2 = User_account()
    user3 = User_account()
    user4 = User_account()
    user5 = User_account()
    
    while ntimes:
        ntimes -= 1
        group_behavior(bank, user1, user2, user3, user4, user5)
        print('bank balance:  ', bank.balance)
        
    
    print('user1:', user1.balance, end='; ')
    print('user2:', user2.balance, end='; ')
    print('user3:', user3.balance, end='; ')
    print('user4:', user4.balance, end='; ')
    print('user5:', user5.balance)
    print('bank balance: ', bank.balance)
    print('bank investing: ', bank.investing)
    print('total balance:  ', 
          bank.balance + bank.investing - sum([user1.balance, user2.balance, user3.balance, user4.balance, user5.balance]))
transaction(100)

bank balance:   1900.0
bank balance:   2210.0
bank balance:   1589.0
bank balance:   1731.0
bank balance:   2258.0
bank balance:   2933.0
bank balance:   3440.0
bank balance:   2496.0
bank balance:   2947.0
bank balance:   4053.0
bank balance:   4648.0
bank balance:   2484.0
bank balance:   3236.0
bank balance:   3113.0
bank balance:   3202.0
bank balance:   2482.0
bank balance:   2234.0
bank balance:   2511.0
bank balance:   3160.0
bank balance:   1844.0
bank balance:   560.0
bank balance:   1104.0
bank balance:   694.0
bank balance:   225.0
bank balance:   703.0
bank balance:   433.0
bank balance:   590.0
bank balance:   931.0
bank balance:   738.0
bank balance:   1965.0
bank balance:   1269.0
bank balance:   2643.0
bank balance:   179.0
bank balance:   1762.0
bank balance:   1486.0
bank balance:   238.0
bank balance:   315.0
bank balance:   1284.0
bank balance:   256.0
bank balance:   1631.0
bank balance:   268.0
bank balance:   542.0
bank balance:   788.0
bank balance:   1310.0
bank balance:   1479.0
bank balance:   332.0
bank balance:   1499.0
bank balance:   1550.0
bank balance:   895.0
bank balance:   706.0
bank balance:   236.0
bank balance:   813.0
bank balance:   632.0
bank balance:   69.0
bank balance:   1063.0
bank balance:   1557.0
bank balance:   3502.0
bank balance:   2052.0
bank balance:   3847.0
bank balance:   463.0
bank balance:   817.0
bank balance:   1436.0
bank balance:   693.0
bank balance:   1024.0
bank balance:   122.0
bank balance:   210.0
bank balance:   489.0
bank balance:   441.0
bank balance:   897.0
bank balance:   2008.0
bank balance:   608.0
bank balance:   248.0
bank balance:   724.0
bank balance:   652.0
bank balance:   1687.0
bank balance:   419.0
bank balance:   1078.0
bank balance:   771.0
bank balance:   2094.0
bank balance:   685.0
bank balance:   1517.0
bank balance:   2566.0
bank balance:   810.0
bank balance:   1729.0
bank balance:   1657.0
bank balance:   592.0
bank balance:   733.0
bank balance:   860.0
bank balance:   174.0
bank balance:   557.0
bank balance:   902.0
bank balance:   812.0
bank balance:   1131.0
bank balance:   1118.0
bank balance:   1207.0
bank balance:   787.0
bank balance:   809.0
bank balance:   2129.0
bank balance:   1317.0
bank balance:   586.0
user1: 1300; user2: 4400; user3: 4900; user4: 2600; user5: 0
bank balance:  586.0
bank investing:  13614.0
total balance:   1000.0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值