并发编程 - 进程 - 1.互斥锁/2.模拟抢票/3.互斥锁与join区别

1.互斥锁:
  互斥锁:Lock 原理就是把并发变成串行,一个一个运行,不错乱,但效率低
  保证多个进程修改一块数据时,大家是一个一个修改,不错乱
  mutex.acquire()
  mutex.release()

 1 from multiprocessing import Process,Lock
 2 import time
 3 
 4 def task(name,mutex):
 5     mutex.acquire()
 6     print('%s 1'%name)
 7     time.sleep(1)
 8     print('%s 2'%name)
 9     time.sleep(1)
10     print('%s 3'%name)
11     mutex.release()
12 
13 if __name__ == "__main__":
14     # 这样写,子进程会copy一份,就变成了全新的锁 ,但是我们应该要让所有的进程持一把锁,
15     # 所以就把锁 传进去,共用一把锁
16     mutex = Lock()
17     for i in range(3):
18         p = Process(target=task,args=('进程%s'%i,mutex))
19         p.start()
20 """
21 # 大家共享资源,错乱了,这里共享终端,打印,结果3个进程错位打印了 
22 进程1 1
23 进程2 1
24 进程0 1
25 进程2 2
26 进程0 2
27 进程1 2
28 进程1 3
29 进程0 3
30 进程2 3
31 """
32 """
33 # 执行效率低了,但是保证了不错乱  
34 进程0 1
35 进程0 2
36 进程0 3
37 进程2 1
38 进程2 2
39 进程2 3
40 进程1 1
41 进程1 2
42 进程1 3
43 """

 

2.模拟抢票:
  多个进程操作同一个文件时,需要上互斥锁:eg:抢票往文件里的票数-1,否则有问题,多人都抢到票,但只有一张
   mutex.acquire()
  mutex.release()
 1 import json
 2 import time
 3 from multiprocessing import Process,Lock
 4 
 5 
 6 def search(name):
 7     time.sleep(1)
 8     dic = json.load(open('db.txt', 'r', encoding='utf-8'))
 9     print('<%s> 查看剩余票数【%s】'%(name,dic['count']))
10 
11 def get(name):
12     time.sleep(1)
13     dic = json.load(open('db.txt', 'r', encoding='utf-8'))
14     if dic['count'] > 0:
15         dic['count'] -= 1
16         time.sleep(3)
17         json.dump(dic,open('db.txt','w',encoding='utf-8'))
18         print('<%s> 购票成功'%name)
19 
20 def task(name,mutex):
21     search(name)
22     mutex.acquire()    # 加上互斥锁 之后,就可以只有一个人购票成功了
23     get(name)
24     mutex.release()
25 
26 if __name__ == "__main__":
27     mutex = Lock()
28     for i in range(10):
29         p = Process(target=task,args=('路人%s'%i,mutex))
30         p.start()

 

3.互斥锁与join区别:
  join:是把代码整体变成了串行
  互斥锁:可以把局部的代码变成串行,只对“共享数据修改”那里上锁

 1 import json
 2 import time
 3 from multiprocessing import Process,Lock
 4 
 5 
 6 def search(name):
 7     time.sleep(1)
 8     dic = json.load(open('db.txt', 'r', encoding='utf-8'))
 9     print('<%s> 查看剩余票数【%s】'%(name,dic['count']))
10 
11 def get(name):
12     time.sleep(1)
13     dic = json.load(open('db.txt', 'r', encoding='utf-8'))
14     if dic['count'] > 0:
15         dic['count'] -= 1
16         time.sleep(3)
17         json.dump(dic,open('db.txt','w',encoding='utf-8'))
18         print('<%s> 购票成功'%name)
19 
20 def task(name):
21     search(name)
22     # mutex.acquire()    # 加上互斥锁 之后,就可以只有一个人购票成功了
23     get(name)
24     # mutex.release()
25 
26 if __name__ == "__main__":
27     mutex = Lock()
28     for i in range(10):
29         p = Process(target=task,args=('路人%s'%i,))
30         p.start()
31         p.join()

 

posted @ 2018-07-31 14:51  mumupa0824  阅读(224)  评论(0编辑  收藏  举报