并发编程-多进程(4)
发布时间:2021-01-07 09:21 所属栏目:52 来源:网络整理
导读:2.需要自己加锁处理。 from multiprocessing import Processfrom multiprocessing import Lockimport jsonimport timeimport osimport randomdef search(): time.sleep(random.randint(1,3)) # 模拟网络延迟(查询环
2.需要自己加锁处理。 from multiprocessing import Process from multiprocessing import Lock import json import time import os import random def search(): time.sleep(random.randint(1,3)) # 模拟网络延迟(查询环节) with open(‘ticket.json‘,encoding=‘utf-8‘) as f1: dic = json.load(f1) print(f‘{os.getpid()} 查看了票数,剩余{dic["count"]}‘) def paid(): with open(‘ticket.json‘,encoding=‘utf-8‘) as f1: dic = json.load(f1) if dic[‘count‘] > 0: dic[‘count‘] -= 1 time.sleep(random.randint(1,3)) # 模拟网络延迟(购买环节) with open(‘ticket.json‘,encoding=‘utf-8‘,mode=‘w‘) as f1: json.dump(dic,f1) print(f‘{os.getpid()} 购买成功‘) def task(lock): search() lock.acquire() paid() lock.release() if __name__ == ‘__main__‘: mutex = Lock() for i in range(6): p = Process(target=task,args=(mutex,)) p.start()示例 2.基于队列通信进程之间互相隔离,要实现进程间通信(IPC,此机制帮我们自动处理锁的问题),multiprocessing支持两种形式:队列和管道,这两种消息都是使用消息传递。 #1:起到缓冲的作用 队列(管道+锁实现):先进先出 生产者消费者模型(基于队列通信): from multiprocessing import Process from multiprocessing import Queue import time import random #生产者 def producer(q,name): for i in range(1,6): time.sleep(random.randint(1,3)) ret=f‘{i}号包子‘ q.put(ret) print(f‘生产者{name}生产了{ret}‘) #消费者 def consumer(q,name): while 1: try: time.sleep(random.randint(1,3)) food=q.get(timeout=3) print(f‘消费者{name}吃了{food}‘) except Exception: return if __name__ == ‘__main__‘: q=Queue()#队列(容器) p1=Process(target=producer,args=(q,‘liye‘)) p2=Process(target=consumer,‘haigou‘)) p1.start() p2.start()示例 (编辑:ASP站长网) |
相关内容
网友评论
推荐文章
热点阅读