抢票是并发执行

多个进程可以访问同一个文件

多个进程共享同一文件,我们可以把文件当数据库,用多个进程模拟多个人执行抢票任务

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并发编程多进程 模拟抢票实现过程相关推荐

  1. python并发之协程_python并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  2. python 多进程并发 阻塞_python并发编程多进程(一)

    一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): 爱根儿老师在一个时间段内有很多任务要做:python备课的任务,写书的 ...

  3. python可以实现操作系统管理_Python并发编程 —— 操作系统基础

    1.手工操作 -- 穿孔卡片 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式.此时还没有操作系统的概念. 特点: (1)用户独占全机.不会出现因资源已被其他用户占用 ...

  4. Python 3 并发编程多进程之进程同步(锁)

    Python 3 并发编程多进程之进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理. 1. ...

  5. python 并发编程 多进程 目录

    python multiprocessing模块 介绍 python 开启进程两种方法 python 并发编程 查看进程的id pid与父进程id ppid python 并发编程 多进程 Proce ...

  6. 第五十一篇 并发编程——多进程

    目录 第五十一篇 并发编程--多进程 一.什么是进程 经典举例说明进程,以及切换 二.进程与程序 三.线程 进程和线程的关系 四.进程PID与PPID 1.PID 2.PPID 五.并发与并行,阻塞与 ...

  7. python 多进程并发_python并发编程之多进程

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  8. python高并发编程_python 并发编程

    一 背景知识 一 操作系统的发展 没有操作系统----穿孔卡片(对应程序和数据) 特点:手工慢与计算机高速形成极大矛盾. (1)用户独占全机. (2)CPU等待手工操作. 批处理系统---磁带存储 控 ...

  9. python互斥锁原理_python并发编程之多进程1------互斥锁与进程间的通信

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

最新文章

  1. 二分法细节学习-mid
  2. python requests text content_python requests的content和text方法的区别
  3. c++ printf怎么用_【经典】把脉printf中的C进阶技巧
  4. python生成数字_Python生成数字图片代码分享
  5. [cerc2012][Gym100624A]20181013
  6. 面向云的.net core开发框架
  7. solr 配置多个entity_solr建索引优化
  8. linux硬盘坏了无法查看分区,Linux 磁盘坏道检测和修复 查看硬盘坏道代码
  9. yarn : 无法加载文件 C:\Users\wangxin67\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.mic
  10. 公园遛狗 / 小白逛公园【线段树】
  11. 前锋java教学大纲,【人教版初中英语教学大纲模板资讯】人教版初中英语教学大纲模板足球知识与常识 - 足球百科 - 599比分...
  12. 【好文推荐】mysql的优点和缺点
  13. Pinyin4j 详解及使用
  14. [完全免费] 在线UML Use Case Diagram 用例工具 - 教程第2部分
  15. 诚之和:EDG夺冠,年轻人为何狂欢?
  16. 普罗米修斯(Promethus)介绍及安装与配置
  17. 计算机及数控编程仿真软件exsl-win7,数控铣编程与仿真实验指导书
  18. java如何从地址串中解析提取省市区(完美匹配中国所有地址)
  19. 汽车操作系统研发:“广义”带动“狭义”——东软睿驰总经理曹斌谈“软件定义汽车”
  20. 【报告阅读】ISO 9241-210:2019

热门文章

  1. 点击SAP Fiori Launchpad某个tile后遇到的错误消息如何解决
  2. docker 容器运行 golang程序_「Docker」 - 运行 amp; 管理容器
  3. 关闭mina服务_如何彻底关闭MINA客户端
  4. java 全局变量 跳出递归循环_Java技术知识点的一些总结
  5. 400 bad request 原因_煤气柜腐蚀原因及防腐措施
  6. win10格式化linux分区,直接删除linux分区再重装linux可以恢復启动么,我是直接在win10里把linux mint...
  7. redhat5 oracle11g安装全程详解,RedHat5+Oracle11g安装全程详解.doc
  8. 怎么修改antd mobile中picker样式_修改 iPhone 双信号方法,超级好玩
  9. floyed java_Floyd算法java实现demo
  10. java web 线程_多线程在javaweb中的应用