一、主题
- Lock类与RLock类相同:由于进程之间随机调度:某进程可能执行n条后,CPU接着执行其他进程。为了多个进程同时操作一个内存中的资源时不产生混乱,我们使用锁。
- Lock类与RLock类的区别:无论是Lock还是RLock,提供的方法都非常简单,acquire和release。但是Lock和RLock的区别是什么呢?RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。注意:如果使用RLock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的锁。
二、多进程实现简易抢票程序
ticket
{"ticket":1}
抢票程序
from multiprocessing import Process
from multiprocessing import Lock
import time
import json
def show_ticket(i):
time.sleep(0.1)
with open('ticket') as f:
dic = json.load(f)
print('余票: %s' %dic.get('ticket'))
def buy_ticket(i, lock):
lock.acquire() #加锁
with open('ticket') as f:
dic = json.load(f)
time.sleep(0.1)
if dic.get('ticket') >0:
dic['ticket'] -= 1
print('\033[32m%s买到票了\033[0m' %i)
else:
print('\033[31m%s没买到票\033[0m' %i)
time.sleep(0.1)
with open('ticket', 'w')as f:
json.dump(dic, f)
lock.release() #释放锁
if __name__ == '__main__':
for i in range(10):
p = Process(target=show_ticket, args=(i,) )
p.start()
lock = Lock()
for i in range(10):
p1 = Process(target=buy_ticket, args=(i,lock))
p1.start()
网友评论