码迷,mamicode.com
首页 > 系统相关 > 详细

Day9 进程同步锁 进程队列 进程池 生产消费模型

时间:2017-08-30 13:11:48      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:通信   隔离   tip   __name__   进程间通信   指定   pen   pid   资源   

进程同步锁:

当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢?

其实也就是相当于让进程独享资源。

 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 进程同步锁 进程队列 进程池 生产消费模型

标签:通信   隔离   tip   __name__   进程间通信   指定   pen   pid   资源   

原文地址:http://www.cnblogs.com/sexiaoshuai/p/7452241.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!