守护线程(守护进程)—> ???
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