4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型
一、守护进程
import random import time from multiprocessing import Process def task(): print('name: egon') time.sleep(random.randint(0,3)) print('sex:male') time.sleep(random.randint(0, 3)) print('age:19') if __name__ == '__main__': p=Process(target=task) p.daemon() #将p设置为主进程的守护进程,主进程结束,无论子进程是否正常执行完,都跟主进程一起结束
二、互斥锁
互斥锁:
强调:必须是lock.acquire()一次,然后 lock.release()释放一次,才能继续lock.acquire(),不能连续的lock.acquire()
互斥锁vs join的区别:
大前提:
二者的原理都是一样,都是将并发变成串行,从而保证有序
区别:
一、join是按照人为指定的顺序执行,而互斥锁是所以进程平等地竞争,谁先抢到谁执行
二、 互斥锁可以让一部分代码(修改共享数据的代码)串行,而join只能将代码整体串行
1 from multiprocessing import Process,Lock 2 import time,random 3 4 mutex=Lock() 5 # 互斥锁: 6 #强调:必须是lock.acquire()一次,然后 lock.release()释放一次,才能继续lock.acquire(),不能连续的lock.acquire() 7 8 # 互斥锁vs join的区别一: 9 # 大前提:二者的原理都是一样,都是将并发变成串行,从而保证有序 10 # 区别:# 互斥锁vs join的区别: 11 # 大前提:二者的原理都是一样,都是将并发变成串行,从而保证有序 12 # 区别:一、join是按照人为指定的顺序执行,而互斥锁是所以进程平等地竞争,谁先抢到谁执行 13 # 二、 互斥锁可以让一部分代码(修改共享数据的代码)串行,而join只能将代码整体串行 14 15 def task1(lock): 16 lock.acquire() #抢锁 17 print('task1:名字是egon') 18 time.sleep(random.randint(1,3)) 19 print('task1:性别是male') 20 time.sleep(random.randint(1,3)) 21 print('task1:年龄是18') 22 lock.release() #释放锁 23 24 def task2(lock): 25 lock.acquire() 26 print('task2:名字是alex') 27 time.sleep(random.randint(1,3)) 28 print('task2:性别是male') 29 time.sleep(random.randint(1,3)) 30 print('task2:年龄是78') 31 lock.release() 32 33 34 def task3(lock): 35 lock.acquire() 36 print('task3:名字是lxx') 37 time.sleep(random.randint(1,3)) 38 print('task3:性别是female') 39 time.sleep(random.randint(1,3)) 40 print('task3:年龄是30') 41 lock.release() 42 43 44 45 if __name__ == '__main__': 46 p1=Process(target=task1,args=(mutex,)) 47 p2=Process(target=task2,args=(mutex,)) 48 p3=Process(target=task3,args=(mutex,)) 49 50 # p1.start() 51 # p1.join() 52 # p2.start() 53 # p2.join() 54 # p3.start() 55 # p3.join() 56 57 p1.start() 58 p2.start() 59 p3.start()
1 from multiprocessing import Process,Lock 2 import time,json,random,os 3 4 lock=Lock() 5 def search(): 6 print('========%s 查票======' % os.getpid()) 7 info=json.load(open('test.txt')) 8 msg='余票为: %s'%info['count'] 9 print(msg) 10 11 def get(lock): 12 lock.acquire() 13 print('========%s 抢票======'%os.getpid()) 14 info = json.load(open('test.txt')) 15 time.sleep(random.random()) 16 if info['count']>0: 17 info['count']-=1 18 time.sleep(random.random()) 19 json.dump(info,open('test.txt','w')) 20 print('抢票成功') 21 else: 22 print('票已售完') 23 lock.release() 24 25 def op(lock): 26 search() 27 get(lock) 28 29 if __name__ == '__main__': 30 for i in range(0,50): 31 p=Process(target=op,args=(lock,)) 32 p.start()