Day9 进程同步锁 进程队列 进程池 生产消费模型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day9 进程同步锁 进程队列 进程池 生产消费模型相关的知识,希望对你有一定的参考价值。
进程同步锁:
当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢?
其实也就是相当于让进程独享资源。
1 from multiprocessing import Process,Lock #引用函数 2 import time 3 def work(name,mutex): 4 mutex.acquire() #在这里加入锁 5 print(‘task <%s> is runing‘ %name) 6 time.sleep(2) 7 print(‘task <%s> is done‘ % name) 8 mutex.release() #加完锁以后必须需要解锁 9 10 if __name__ == ‘__main__‘: 11 mutex=Lock() 12 p1=Process(target=work,args=(‘egon‘,mutex)) 13 p2=Process(target=work,args=(‘alex‘,mutex)) 14 p1.start() 15 p2.start() 16 print(‘主‘)
比如说模拟抢票的功能:
要先写一个文本 ("count":1) 就记个数就行
1 import json 2 import os 3 import time 4 from multiprocessing import Process,Lock 5 def search(): 6 dic=json.load(open(‘db.txt‘)) 7 print(‘\033[32m[%s] 看到剩余票数<%s>\033[0m‘ %(os.getpid(),dic[‘count‘])) 8 def get_ticket(): 9 dic = json.load(open(‘db.txt‘)) 10 time.sleep(0.5) #模拟读数据库的网络延迟 11 if dic[‘count‘] > 0: 12 dic[‘count‘]-=1 13 time.sleep(0.5) # 模拟写数据库的网络延迟 14 json.dump(dic,open(‘db.txt‘,‘w‘)) 15 print(‘\033[31m%s 购票成功\033[0m‘ %os.getpid()) 16 def task(mutex): 17 search() 18 mutex.acquire() 19 get_ticket() 20 mutex.release() 21 if __name__ == ‘__main__‘: 22 mutex=Lock() 23 for i in range(10): 24 p=Process(target=task,args=(mutex,)) 25 p.start()
进程队列:
共享内存的方式:
1 from multiprocessing import Process,Manager,Lock #Manager共享内存函数 2 3 def task(dic,mutex): 4 with mutex: 5 dic[‘count‘]-=1 6 7 if __name__ == ‘__main__‘: 8 mutex=Lock() 9 m=Manager() 10 dic=m.dict({‘count‘:100}) 11 p_l=[] 12 for i in range(100): 13 p=Process(target=task,args=(dic,mutex)) 14 p_l.append(p) 15 p.start() 16 17 for p in p_l: 18 p.join() 19 print(dic)
队列:
进程彼此之间隔离,要实现进程间通信
1 from multiprocessing import Queue #引用函数 2 q=Queue(3) #意味着你队列长队最大为三 3 4 q.put(‘first‘) 5 q.put(‘second‘) 6 q.put(‘third‘) 7 # q.put(‘fourth‘) #满了的话会一直卡住 8 9 print(q.get()) 10 print(q.get()) 11 print(q.get()) 12 print(q.get()) 13 14 #了解 15 # q=Queue(3) 16 # 17 # q.put(‘first‘,block=False) 18 # q.put(‘second‘,block=False) 19 # q.put(‘third‘,block=False) #这样的话队列满了就会抛出异常,不会卡在这里 20 # # q.put_nowait(‘fourth‘)
21 #q.put(‘fourth‘,block=False) 22 # q.put(‘fourth‘,timeout=3) #指定抛出时间,如果3秒后队列还是满的抛出异常
生产者消费者模型:
以上是关于Day9 进程同步锁 进程队列 进程池 生产消费模型的主要内容,如果未能解决你的问题,请参考以下文章
Python-Cpython解释器支持的进程与线程-Day9