网络编程之进阶
---恢复内容开始---
1、互斥锁
2、进程间通信
3、生成者消费者模型
1互斥锁
from multiprocessing import Process,Lock import os import time def work(mutex):#传入一个锁 mutex.acquire()#获得一个锁 print('task[%s] 上厕所' %os.getpid())#运行 time.sleep(3)#睡眠三秒 print('task[%s] 上完厕所' %os.getpid())#运行 mutex.release()#释放锁 if __name__ == '__main__': mutex=Lock()#实例化一个锁 p1=Process(target=work,args=(mutex,))#实例化一个进程 p2=Process(target=work,args=(mutex,))#实例化一个进程 p3=Process(target=work,args=(mutex,))#实例化一个进程 p1.start()#启动 p2.start()#启动 p3.start()#启动 print('主') #给子线程加上锁:就相当于子线程是串行的。
2、进程间通信
模拟抢票系统(这个版本每次只能一个进程使用)
#残次版 from multiprocessing import Process,Lock import json import time import random import os def task(mutex): mutex.acquire()#获得锁 dic=json.load(open('db.txt'))#反序列化文件 print('剩余票数%s' %dic['count'])#打印剩余票数 if dic['count'] > 0:#判断是有剩余的票数 dic['count']-=1#票数减一 time.sleep(random.randint(1,3))#睡眠一段时间 json.dump(dic,open('db.txt','w'))#序列化保存 print('%s 购票成功' %os.getpid())#打印购票成功 mutex.release()#释放锁 if __name__ == '__main__': mutex=Lock()#生成一个锁 for i in range(2):#循环2次 p=Process(target=task,args=(mutex,))#生成一个线程 p.start()#启动
模拟抢票软件完整版
from multiprocessing import Process,Lock import json import time import random import os def search():#定义查询票数 dic=json.load(open('db.txt',))#反序列化数据 print('剩余票数%s' %dic['count'])#查看剩余的票数 def get_ticket():#定义购票的函数 dic=json.load(open('db.txt',))#反序列化数据 if dic['count'] > 0:#判断是否有票 dic['count']-=1#票数减一 json.dump(dic,open('db.txt','w'))#序列化数据 print('%s 购票成功' %os.getpid())#打印哪个进程购票 def task(mutex): search()#查询时 time.sleep(random.randint(1, 3)) #模拟购票一系列繁琐的过程所花费的时间 mutex.acquire()#获得一个进程锁 get_ticket()#购票 mutex.release()#释放锁 if __name__ == '__main__': mutex=Lock()#实例化一个锁 for i in range(5): p=Process(target=task,args=(mutex,))#一个进程 p.start()#启动一个进程
3、生成者和消费者模型
队列:
from multiprocessing import Process,Queue #1:可以往队列里放任意类型的数据 2 队列:先进先出 q=Queue(3) q.put('first') q.put('second') q.put('third') # q.put('fourht',block=False)#不是默认值就会报错 q.put('fourht')#是默认值就会夯住 print(q.get()) print(q.get()) print(q.get())
一个生成者和一个消费者模型
# from multiprocessing import Process,Queue # import time # import random # import os # def consumer(q): # while True: # res=q.get() # if res is None: # break # time.sleep(random.randint(1,3)) # print('\033[45m%s 吃了 %s\033[0m' % (os.getpid(), res)) # def producer(q): # for i in range(5): # time.sleep(2) # res='包子%s' %i # q.put(res) # print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res)) # q.put(None) # if __name__ == '__main__': # q=Queue() # #生产者们:厨师们 # p1=Process(target=producer,args=(q,)) # # #消费者们:吃货们 # p2=Process(target=consumer,args=(q,)) # p1.start() # p2.start() # p1.join()# # p2.join()#运行完后才会执行下面的 # print('主')
多个生成者和多个消费者
#几个消费者,有几个None from multiprocessing import Process,Queue import time import random import os def consumer(q): while True: res=q.get() if res is None:break time.sleep(random.randint(1,3)) print('\033[45m%s 吃了 %s\033[0m' % (os.getpid(), res)) def product_baozi(q): for i in range(3): time.sleep(2) res='包子%s' %i q.put(res) print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res)) def product_gutou(q): for i in range(3): time.sleep(2) res='骨头%s' %i q.put(res) print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res)) def product_ganshui(q): for i in range(3): time.sleep(2) res='泔水%s' %i q.put(res) print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res)) if __name__ == '__main__': q=Queue() #生产者们:厨师们 p1=Process(target=product_baozi,args=(q,)) p2=Process(target=product_gutou,args=(q,)) p3=Process(target=product_ganshui,args=(q,)) #消费者们:吃货们 p4=Process(target=consumer,args=(q,)) p5=Process(target=consumer,args=(q,)) p_l=[p1,p2,p3,p4,p5] for p in p_l: p.start() # # for p in p_l: # p.join() # # p1.start() # p2.start() # p3.start() # p4.start() # p5.start() p1.join() p2.join() p3.join() q.put(None) q.put(None) p4.join() p5.join()
print('主')
另一种方法写一个生成者和一个消费者
from multiprocessing import Process,JoinableQueue import time import random import os def consumer(q): while True: res=q.get() time.sleep(random.randint(1,3)) print('\033[45m%s 吃了 %s\033[0m' % (os.getpid(), res)) q.task_done()#接收一个,它会返回一个值给生成者 def product_baozi(q): for i in range(5): time.sleep(2) res='包子%s' %i q.put(res) print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res)) q.join() if __name__ == '__main__': q=JoinableQueue() #生产者们:厨师们 p1=Process(target=product_baozi,args=(q,)) #消费者们:吃货们 p4=Process(target=consumer,args=(q,)) p4.daemon=True#守护进程主进程结束它也结束 p1.start() p4.start() p1.join()#等p1运行完 print('主')
多个生成者与消费者
from multiprocessing import Process,JoinableQueue import time import random import os def consumer(q): while True: res=q.get() time.sleep(random.randint(1,3)) print('\033[45m%s 吃了 %s\033[0m' % (os.getpid(), res)) q.task_done() def product_baozi(q): for i in range(3): time.sleep(2) res='包子%s' %i q.put(res) print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res)) q.join() def product_gutou(q): for i in range(3): time.sleep(2) res='骨头%s' %i q.put(res) print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res)) q.join() def product_ganshui(q): for i in range(3): time.sleep(2) res='泔水%s' %i q.put(res) print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res)) q.join() if __name__ == '__main__': q=JoinableQueue() #生产者们:厨师们 p1=Process(target=product_baozi,args=(q,)) p2=Process(target=product_gutou,args=(q,)) p3=Process(target=product_ganshui,args=(q,)) #消费者们:吃货们 p4=Process(target=consumer,args=(q,)) p5=Process(target=consumer,args=(q,)) p4.daemon=True p5.daemon=True p_l=[p1,p2,p3,p4,p5] for p in p_l: p.start() p1.join() p2.join() p3.join() print('主')
---恢复内容结束---