1. 进程同步问题:实现一个多进程银行转账系统,使用锁保证余额操作的原子性
import multiprocessing
class BankAccount:
def __init__(self, balance, use_shared_mode=False):
self.use_shared_mode = use_shared_mode
if use_shared_mode:
manager = multiprocessing.Manager()
self.balance = manager.Value('i', balance)
else:
self.balance = balance
self.lock = multiprocessing.Lock()
def transfer(self, amount):
self.lock.acquire()
try:
if self.use_shared_mode:
current_balance = self.balance.value
else:
current_balance = self.balance
if current_balance >= amount:
if self.use_shared_mode:
self.balance.value -= amount
print(f"成功转出 {amount} 元,当前余额: {self.balance.value} 元")
else:
self.balance -= amount
print(f"成功转出 {amount} 元,当前余额: {self.balance} 元")
else:
print("余额不足,转账失败")
finally:
self.lock.release()
def transfer_money(account, amount):
account.transfer(amount)
if __name__ == "__main__":
use_shared_mode = False
account = BankAccount(1000, use_shared_mode)
transfer_amounts = [200, 300, 500, 100]
processes = []
for amount in transfer_amounts:
p = multiprocessing.Process(target=transfer_money, args=(account, amount))
processes.append(p)
p.start()
for p in processes:
p.join()
if use_shared_mode:
final_balance = account.balance.value
else:
final_balance = account.balance
print(f"最终账户余额: {final_balance} 元")
2. 性能优化:对比进程池大小设置为CPU核数2倍与默认值的执行效率差异
def cpu_intensive_task(n):
result = 0
for i in range(n):
result += i
return result
if __name__ == "__main__":
cpu_count = multiprocessing.cpu_count()
task_count = 20
task_size = 10 ** 7
print(task_size)
start_time_default = time.time()
with multiprocessing.Pool() as pool:
results_default = pool.map(cpu_intensive_task, [task_size] * task_count)
end_time_default = time.time()
time_taken_default = end_time_default - start_time_default
print(f"默认进程池大小({cpu_count})执行时间: {time_taken_default:.4f} 秒")
pool_size_double = cpu_count * 2
start_time_double = time.time()
with multiprocessing.Pool(processes=pool_size_double) as pool:
results_double = pool.map(cpu_intensive_task, [task_size] * task_count)
end_time_double = time.time()
time_taken_double = end_time_double - start_time_double
print(f"进程池大小为 CPU 核数 2 倍({pool_size_double})执行时间: {time_taken_double:.4f} 秒")
if time_taken_default < time_taken_double:
print("默认进程池大小执行效率更高。")
elif time_taken_default > time_taken_double:
print("进程池大小为 CPU 核数 2 倍时执行效率更高。")
else:
print("两种进程池大小执行效率相同。")
3. 僵尸进程处理:编写一个能自动回收子进程的进程监视器
import os
import time
import multiprocessing
def child_task():
print(f"子进程 {os.getpid()} 开始运行")
time.sleep(2)
print(f"子进程 {os.getpid()} 结束运行")
if __name__ == "__main__":
processes = []
for _ in range(3):
p = multiprocessing.Process(target=child_task)
p.start()
processes.append(p)
for p in processes:
p.join()
print("所有子进程已结束,主进程退出。")