python模拟app抢票_python并发编程多进程 模拟抢票实现过程
抢票是并发执行
多个进程可以访问同一个文件
多个进程共享同一文件,我们可以把文件当数据库,用多个进程模拟多个人执行抢票任务
db.txt
{"count": 1}
并发运行,效率高,但竞争写同一文件,数据写入错乱,只有一张票,都卖成功给了10个人
#文件db.txt的内容为:{"count":1}
#注意一定要用双引号,不然json无法识别
from multiprocessing import Process
import time
import json
class Foo(object):
def search(self, name):
with open("db.txt", "r") as f_read:
dic = json.load(f_read)
time.sleep(1) # 模拟读数据的网络延迟
print("用户 查看剩余票数为 [%s]" % (name, dic["count"]))
def get(self, name):
with open("db.txt", "r") as f_read:
dic = json.load(f_read)
if dic["count"] > 0:
dic["count"] -= 1
time.sleep(1) # 模拟写数据的网络延迟
with open("db.txt", "w") as f_write:
json.dump(dic, f_write)
print(" 购票成功" % name)
print("剩余票数为 [%s]" % dic["count"])
else:
print("没票了,抢光了")
def task(self, name):
self.search(name)
self.get(name)
if __name__ == "__main__":
obj = Foo()
for i in range(1,11): # 模拟并发10个客户端抢票
p = Process(target=obj.task, args=("路人%s" % i,))
p.start()
总结:程序出现数据写入错乱
大家都查到票为1,都购票成功
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
购票成功
剩余票数为 [0]
购票成功
剩余票数为 [0]
购票成功
剩余票数为 [0]
购票成功
剩余票数为 [0]
购票成功
剩余票数为 [0]
购票成功
剩余票数为 [0]
购票成功
剩余票数为 [0]
购票成功
剩余票数为 [0]
购票成功
剩余票数为 [0]
购票成功
剩余票数为 [0]
总结程序出现数据写入错乱
加锁处理:购票行为由并发变成了串行,牺牲了运行效率,但保证了数据安全
购票功能不应该并发执行,查票应该是并发执行的
查票准不准确不重要,有可能这张票就被别人买走
一个人写完以后,让另外一个人基于上一个人写的结果,再做购票操作
#把文件db.txt的内容重置为:{"count":1}
from multiprocessing import Process
from multiprocessing import Lock
import time
import json
class Foo(object):
def search(self, name):
with open("db.txt", "r") as f_read:
dic = json.load(f_read)
time.sleep(1) # 模拟读数据的网络延迟
print("用户 查看剩余票数为 [%s]" % (name, dic["count"]))
def get(self, name):
with open("db.txt", "r") as f_read:
dic = json.load(f_read)
if dic["count"] > 0:
dic["count"] -= 1
time.sleep(1) # 模拟写数据的网络延迟
with open("db.txt", "w") as f_write:
json.dump(dic, f_write)
print(" 购票成功" % name)
print("剩余票数为 [%s]" % dic["count"])
else:
print("没票了,抢光了")
def task(self, name, mutex):
self.search(name)
mutex.acquire()
self.get(name)
mutex.release()
if __name__ == "__main__":
mutex = Lock()
obj = Foo()
for i in range(1,11): # 模拟并发10个客户端抢票
p = Process(target=obj.task, args=("路人%s" % i, mutex))
p.start()
执行结果
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
用户 查看剩余票数为 [1]
购票成功
剩余票数为 [0]
没票了,抢光了
没票了,抢光了
没票了,抢光了
没票了,抢光了
没票了,抢光了
没票了,抢光了
没票了,抢光了
没票了,抢光了
没票了,抢光了
with lock
相当于lock.acquire(),执行完自代码块自动执行lock.release()
from multiprocessing import Process
from multiprocessing import Lock
import time
import json
class Foo(object):
def search(self, name):
with open("db.txt", "r") as f_read:
dic = json.load(f_read)
time.sleep(1) # 模拟读数据的网络延迟
print("用户 查看剩余票数为 [%s]" % (name, dic["count"]))
def get(self, name):
with open("db.txt", "r") as f_read:
dic = json.load(f_read)
if dic["count"] > 0:
dic["count"] -= 1
time.sleep(1) # 模拟写数据的网络延迟
with open("db.txt", "w") as f_write:
json.dump(dic, f_write)
print(" 购票成功" % name)
print("剩余票数为 [%s]" % dic["count"])
else:
print("没票了,抢光了")
def task(self, name, mutex):
self.search(name)
with mutex: # 相当于lock.acquire(),执行完自代码块自动执行lock.release()
self.get(name)
if __name__ == "__main__":
mutex = Lock()
obj = Foo()
for i in range(1,11): # 模拟并发10个客户端抢票
p = Process(target=obj.task, args=("路人%s" % i, mutex))
p.start()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
本文标题: python并发编程多进程 模拟抢票实现过程
本文地址: http://www.cppcns.com/jiaoben/python/268996.html
python模拟app抢票_python并发编程多进程 模拟抢票实现过程相关推荐
- python并发之协程_python并发编程之协程
一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...
- python 多进程并发 阻塞_python并发编程多进程(一)
一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): 爱根儿老师在一个时间段内有很多任务要做:python备课的任务,写书的 ...
- python可以实现操作系统管理_Python并发编程 —— 操作系统基础
1.手工操作 -- 穿孔卡片 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式.此时还没有操作系统的概念. 特点: (1)用户独占全机.不会出现因资源已被其他用户占用 ...
- Python 3 并发编程多进程之进程同步(锁)
Python 3 并发编程多进程之进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理. 1. ...
- python 并发编程 多进程 目录
python multiprocessing模块 介绍 python 开启进程两种方法 python 并发编程 查看进程的id pid与父进程id ppid python 并发编程 多进程 Proce ...
- 第五十一篇 并发编程——多进程
目录 第五十一篇 并发编程--多进程 一.什么是进程 经典举例说明进程,以及切换 二.进程与程序 三.线程 进程和线程的关系 四.进程PID与PPID 1.PID 2.PPID 五.并发与并行,阻塞与 ...
- python 多进程并发_python并发编程之多进程
一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...
- python高并发编程_python 并发编程
一 背景知识 一 操作系统的发展 没有操作系统----穿孔卡片(对应程序和数据) 特点:手工慢与计算机高速形成极大矛盾. (1)用户独占全机. (2)CPU等待手工操作. 批处理系统---磁带存储 控 ...
- python互斥锁原理_python并发编程之多进程1------互斥锁与进程间的通信
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
最新文章
- 二分法细节学习-mid
- python requests text content_python requests的content和text方法的区别
- c++ printf怎么用_【经典】把脉printf中的C进阶技巧
- python生成数字_Python生成数字图片代码分享
- [cerc2012][Gym100624A]20181013
- 面向云的.net core开发框架
- solr 配置多个entity_solr建索引优化
- linux硬盘坏了无法查看分区,Linux 磁盘坏道检测和修复 查看硬盘坏道代码
- yarn : 无法加载文件 C:\Users\wangxin67\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.mic
- 公园遛狗 / 小白逛公园【线段树】
- 前锋java教学大纲,【人教版初中英语教学大纲模板资讯】人教版初中英语教学大纲模板足球知识与常识 - 足球百科 - 599比分...
- 【好文推荐】mysql的优点和缺点
- Pinyin4j 详解及使用
- [完全免费] 在线UML Use Case Diagram 用例工具 - 教程第2部分
- 诚之和:EDG夺冠,年轻人为何狂欢?
- 普罗米修斯(Promethus)介绍及安装与配置
- 计算机及数控编程仿真软件exsl-win7,数控铣编程与仿真实验指导书
- java如何从地址串中解析提取省市区(完美匹配中国所有地址)
- 汽车操作系统研发:“广义”带动“狭义”——东软睿驰总经理曹斌谈“软件定义汽车”
- 【报告阅读】ISO 9241-210:2019
热门文章
- 点击SAP Fiori Launchpad某个tile后遇到的错误消息如何解决
- docker 容器运行 golang程序_「Docker」 - 运行 amp; 管理容器
- 关闭mina服务_如何彻底关闭MINA客户端
- java 全局变量 跳出递归循环_Java技术知识点的一些总结
- 400 bad request 原因_煤气柜腐蚀原因及防腐措施
- win10格式化linux分区,直接删除linux分区再重装linux可以恢復启动么,我是直接在win10里把linux mint...
- redhat5 oracle11g安装全程详解,RedHat5+Oracle11g安装全程详解.doc
- 怎么修改antd mobile中picker样式_修改 iPhone 双信号方法,超级好玩
- floyed java_Floyd算法java实现demo
- java web 线程_多线程在javaweb中的应用