抢票是并发执行
多个进程可以访问同一个文件
多个进程共享同一文件,我们可以把文件当数据库,用多个进程模拟多个人执行抢票任务
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>用户 查看剩余票数为 [%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("<%s> 购票成功" % 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] <路人2>用户 查看剩余票数为 [1] <路人3>用户 查看剩余票数为 [1] <路人4>用户 查看剩余票数为 [1] <路人5>用户 查看剩余票数为 [1] <路人6>用户 查看剩余票数为 [1] <路人7>用户 查看剩余票数为 [1] <路人8>用户 查看剩余票数为 [1] <路人9>用户 查看剩余票数为 [1] <路人10>用户 查看剩余票数为 [1] <路人1> 购票成功 剩余票数为 [0] <路人2> 购票成功 剩余票数为 [0] <路人3> 购票成功 剩余票数为 [0] <路人4> 购票成功 剩余票数为 [0] <路人5> 购票成功 剩余票数为 [0] <路人6> 购票成功 剩余票数为 [0] <路人7> 购票成功 剩余票数为 [0] <路人8> 购票成功 剩余票数为 [0] <路人9> 购票成功 剩余票数为 [0] <路人10> 购票成功 剩余票数为 [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>用户 查看剩余票数为 [%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("<%s> 购票成功" % 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()
执行结果
<路人2>用户 查看剩余票数为 [1] <路人3>用户 查看剩余票数为 [1] <路人1>用户 查看剩余票数为 [1] <路人4>用户 查看剩余票数为 [1] <路人5>用户 查看剩余票数为 [1] <路人7>用户 查看剩余票数为 [1] <路人6>用户 查看剩余票数为 [1] <路人8>用户 查看剩余票数为 [1] <路人9>用户 查看剩余票数为 [1] <路人10>用户 查看剩余票数为 [1] <路人2> 购票成功 剩余票数为 [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>用户 查看剩余票数为 [%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("<%s> 购票成功" % 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 Process多进程实现过程,包括了Python Process多进程实现过程的使用技巧和注意事项,需要的朋友参考一下 进程的概念 程序是没有运行的代码,静态的; 进程是运行起来的程序,进程是一个程序运行起来之后和资源的总称; 程序只有一个,但同一份程序可以有多个进程;例如,电脑上多开QQ; 程序和进程的区别在于有没有资源,进程有资源而程序没有资源,进程是一个资源分配的
本文向大家介绍python并发编程之多进程、多线程、异步和协程详解,包括了python并发编程之多进程、多线程、异步和协程详解的使用技巧和注意事项,需要的朋友参考一下 最近学习python并发,于是对多进程、多线程、异步和协程做了个总结。 一、多线程 多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活状态,从而让多个函数的操作同时运行。即使是单CPU的计算机,也可以通过不停地在不同
本文向大家介绍用Python抢火车票的简单小程序实现解析,包括了用Python抢火车票的简单小程序实现解析的使用技巧和注意事项,需要的朋友参考一下 利用Python制作自动抢火车票小程序,过年再也不要担心没票了! 前言 每次过年很多人都会因为抢不到火车票而回不了家,所以小编利用Python写了一个自动抢火车票的工具,希望大家能抢到火车票,回家过个好年! 我本来想自己写一个练练手的,但是转眼一想,P
本文向大家介绍Python自动化xpath实现自动抢票抢货,包括了Python自动化xpath实现自动抢票抢货的使用技巧和注意事项,需要的朋友参考一下 小伙伴们,这次推文讲的是‘xpath‘,掌握起来不难的哦。而且,熟悉了这套路,别说pubmed,任何你能在浏览器实现的操作,都基本能通过selenium自动化进行。 总代码: 代码1 for i in range(1,50+1): printg('
本章讲解 Rust 中,并发,并行,多线程编程的相关知识。
本文向大家介绍Python多进程编程multiprocessing代码实例,包括了Python多进程编程multiprocessing代码实例的使用技巧和注意事项,需要的朋友参考一下 在 多线程与多进程的比较 这一篇中记录了多进程编程的一种方式. 下面记录一下多进程编程的别一种方式,即使用multiprocessing编程 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教