py并发_Lock笔记

Lock

并发进程的执行如果要想进行同步处理,那么就必须对一些核心的代码部分进行同步,所以在Python中提供了一个Lock的同步锁机制,利用这种锁机制可以实现部分代码的同步锁定,保证每一次只允许一个进程执行这一部分的代码。

售车票程序锁机制处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# coding: UTF-8
import multiprocessing,time # 导入多进程开发模块
def worker(lock,dict): # 进程的处理函数
while True: #持续售票
lock.acquire(timeout=5) # 请求锁定,如果5秒没有锁定则放弃锁定
number = dict.get("ticket") # 获取当前的票数
if number > 0: # 如果现在还有剩余票
time.sleep(1) # 判断和售票之间追加延迟
number -= 1 # 让票数减1
print("[%s] ticket = %s" % (multiprocessing.current_process().name,number)) # 输出提示信息
dict.update({"ticket":number}) # 更新票数
else: # 已经没有票了
break # 退出当前的售票循环
lock.release() # 释放锁
def main(): # 主函数
lock = multiprocessing.Lock() #定义了一个进程的同步锁
manager = multiprocessing.Manager() # 创建共享数据对象
# 此时创建了一个可以被多个进程之间共享的字典对象
mgr_dict = manager.dict(ticket=5) #默认提供有5张票
# 如果要进行售票肯定要同时准备多个进程于是下面创建10个售票进程列表
job_process = [multiprocessing.Process(target=worker,
name=("售票员 - %s" % item),
args=(lock,mgr_dict,))
for item in range(3)] # 创建进程列表
for process in job_process:
process.start() # 启动售票进程
for process in job_process:
process.join()
print("[%s]所有进程执行完毕,最终剩余票数:%s" % (multiprocessing.current_process().name,mgr_dict.get("ticket")))
if __name__ == "__main__":
main()

[售票员 - 0] ticket = 4
[售票员 - 1] ticket = 3
[售票员 - 2] ticket = 2
[售票员 - 0] ticket = 1
[售票员 - 1] ticket = 0
[MainProcess]所有进程执行完毕,最终剩余票数:0

进程已结束,退出代码0

注: 一旦程序之中追加了锁,那么程序的部分代码就只能够以单进程的模式执行了,这样就势必造成程序的执行性能下降,只有在考虑数据操作安全性的问题时的情况下才会用到锁机制。


py并发_Lock笔记
https://blog.wangxk.cc/2020/02/01/py并发-Lock笔记/
作者
Mike
发布于
2020年2月1日
许可协议