| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- """
- 多个线程竞争一个资源 - 保护临界资源 - 锁(Lock/RLock)
- 多个线程竞争多个资源(线程数>资源数) - 信号量(Semaphore)
- 多个线程的调度 - 暂停线程执行/唤醒等待中的线程 - Condition
- """
- from concurrent.futures import ThreadPoolExecutor
- from random import randint
- from time import sleep
- import threading
- class Account():
- """银行账户"""
- def __init__(self, balance=0):
- self.balance = balance
- lock = threading.Lock()
- self.condition = threading.Condition(lock)
- def withdraw(self, money):
- """取钱"""
- with self.condition:
- while money > self.balance:
- self.condition.wait()
- new_balance = self.balance - money
- sleep(0.001)
- self.balance = new_balance
- def deposit(self, money):
- """存钱"""
- with self.condition:
- new_balance = self.balance + money
- sleep(0.001)
- self.balance = new_balance
- self.condition.notify_all()
- def add_money(account):
- while True:
- money = randint(5, 10)
- account.deposit(money)
- print(threading.current_thread().name,
- ':', money, '====>', account.balance)
- sleep(0.5)
- def sub_money(account):
- while True:
- money = randint(10, 30)
- account.withdraw(money)
- print(threading.current_thread().name,
- ':', money, '<====', account.balance)
- sleep(1)
- def main():
- account = Account()
- with ThreadPoolExecutor(max_workers=10) as pool:
- for _ in range(5):
- pool.submit(add_money, account)
- pool.submit(sub_money, account)
- if __name__ == '__main__':
- main()
|