多进程multiprocessing
多进程实现简易版的抢票工具
实现:多个进程共享同一文件,把文件当数据库,用多个进程模拟多个人执行抢票任务
关键词:多进程,锁
1) 多进程
import json
import os
import time
from multiprocessing import Process, Lock, set_start_method
FILE_PATH = os.path.join(os.getcwd(), 'data.json')
class BuyTickets:
def search(self, name):
with open(FILE_PATH, 'r') as f:
dic = json.loads(f.read())
time.sleep(1)
print(f"{name}用户查看剩余余票数为:{dic['count']}")
def get(self, name):
with open(FILE_PATH, 'r') as f_read:
dic = json.loads(f_read.read())
if dic.get('count') > 0:
dic['count'] -= 1
time.sleep(1)
with open(FILE_PATH, 'w') as f_write:
json.dump(dic, f_write)
print(f'{name}购票成功!')
print(f'剩余票数为:{dic["count"]}')
else:
print('没票了')
def task(self, name, lock):
self.search(name)
with lock:
self.get(name)
if __name__ == '__main__':
set_start_method('fork')
_buy = BuyTickets()
mutex = Lock()
for i in range(10):
p = Process(target=_buy.task, args=("路人%s" % i, mutex))
p.start()
- 进程池
from multiprocessing import Pool,Manager
class BuyTickets:
def search(self, name):
with open(FILE_PATH, 'r') as f:
dic = json.loads(f.read())
time.sleep(1)
print(f"{name}用户查看剩余余票数为:{dic['count']}")
def get(self, name):
with open(FILE_PATH, 'r') as f_read:
dic = json.loads(f_read.read())
if dic.get('count') > 0:
dic['count'] -= 1
time.sleep(1)
with open(FILE_PATH, 'w') as f_write:
json.dump(dic, f_write)
print(f'{name}购票成功!')
print(f'剩余票数为:{dic["count"]}')
else:
print('没票了')
def task(self, name, lock):
self.search(name)
with lock:
self.get(name)
if __name__ == '__main__':
p = Pool(5)
set_start_method('forkserver', force=True)
_buy = BuyTickets()
mutex = Manager().Lock()
for i in range(10):
res = p.apply_async(_buy.task, args=("路人%s" % i, mutex))
p.close()
p.join()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)