进程(二)
进程同步(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模块

浙公网安备 33010602011771号