进程(二)

进程同步(multiprocess.Lock)

锁------ multiprocess.Lock

 1 import os
 2 import time
 3 import random
 4 from multiprocessing import Process
 5 
 6 def work(n):
 7     print('%s:' %s is running' %(n,os.getpid()))
 8     time.sleep(random.random)
 9     print('%s:%s is done' %(n,os.getpid()))
10 
11 if __name__ == '__main__':
12     for i in rang(3):
13         p = Process(target = work,args = (i,))
14         p.start()
15         
多进程抢占输出资源
 1 import os 
 2 import time
 3 import random
 4 from multiprocess import Process,Lock
 5 def work(lock,n):
 6     lock.acquire()
 7     print('%s: %s is running' %(n,os.getpid()))
 8     time.sleep(random.random)
 9     print('%s: %s is done'  %(n,getpid()))
10     lock.release()
11 
12 if __name__ == '__main__':
13     lock = Lock()
14     for i in range(3):
15         p = Process(target = work,args =(lock,i))
16         p.start()
使用锁维护执行顺序

例子:模拟抢票,数据安全性

 1 创建一个文件ticket:{"ticket:5"}
 2 注意一定要用双引号,不然json无法识别
 3 并发运行,效率高
 4 import time,json,random
 5 from multiprocessing import Process,Lock
 6 
 7 def show():
 8     with open('ticket') as f:
 9         dic = json.load(f)
10     print('余票:'%s' %dic['ticket'])
11 
12 def buy_ticket():
13     lock.acquire()    #拿钥匙
14     with open ('ticket') as f:
15         dic = json.load(f)
16         time.sleep(0.1)    #模拟读数据的网络延迟
17     if dic['ticket']>0:
18         dic['ticket'] -=1
19         time.sleep(random.random())      #模拟读数据的网络延迟
20         print('\033[32m购票成功\033[0m')
21     else:
22         print('\033[[31m购票失败,票已售完\033[0m')
23     time.sleep(0.1)
24     with open ('ticket','w') as f:
25         json.dump(dic,f)
26     lock.release()        #还钥匙
27 
28 if __name__ == '__main__':
29     for i in range(10):
30         p = Process(target = show,args=(i,))
31         p.start()
32     lock = Lock()
33     for i in range(10):
34         p = Process(target = buy_ticket,args = (i,))
35         p.start()
使用锁保证数据安全
1 加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,速度相对会慢,但是却保证了数据安全、顺序
2 
3 
4 解决方案兼顾:1.既能效率高(多个进程共享一块内存的数据)2.帮我们处理好锁的问题。这就是multiprocessing 模块为我们提供的基于消息的IPC通信机制:队列和管道。

 进程间通信----队列

队列

创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递

方法:

Queue([maxsize])
创建共享的进程队列。maxsize是队列中允许的最大项数,如果省略此参数,则无大小限制。
Queue的实例q的方法:

q.get() 
返回q中的一个值。如果q为空则会一直阻塞。

q.get_nowait():方法同q.get(False)一样。
try:
    q.get_nowait(3)   #可以使用get_nowait,如果队列满了不会阻塞,但是会因为没取到值而报错。
except:      #因此我们可以用一个try语句来处理这个错误。这样程序不会一直阻塞下去。
    print('队列已经空了')

print(q.empty())    #空了

生产者消费者模型
多个消费者例子,有几个消费者就需要发送几次结束信号

multiprocessing---Pool进程池

from multiprocess import Pool模块

 

posted @ 2019-05-04 17:06  Yan帅  阅读(125)  评论(0)    收藏  举报