进程同步控制 Lock Semaphore Event

一.Lock

当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题
加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改
lock=Lock() lock.acquire() # 拿钥匙进门 lock.release() # 还钥匙

抢票系统

from multiprocessing import Process
from multiprocessing import Lock
import json
import time
# def show_ticket():
#     with open(a,"r",encoding="utf-8") as f:
#         dic=json.load(f)   #用load
#         print("余票为%s"%(dic["ticket"]))
def buy_ticket(i,lock):
    lock.acquire()  # 拿钥匙进门
    with open("D:lianxipython网络编程和并发编程d37\ticket","r",encoding="utf-8") as f:
        dic=json.load(f)
        if dic["ticket"] >=1:
            dic["ticket"]-=1
            print("%s买到了票"%i)
        else:
            print("%s没买到票"%i)
    time.sleep(0.1)
    with open("D:lianxipython网络编程和并发编程d37\ticket", "w", encoding="utf-8") as f:
        json.dump(dic,f)
    lock.release()  # 还钥匙
if __name__ == "__main__":
    lock=Lock()
    for i in range(5):
        # p=Process(target=show_ticket)
        # p.start()
        p1 = Process(target=buy_ticket,args=(i,lock))
        p1.start()
View Code

二.Semaphore 上n把锁

from multiprocessing import Semaphore

ktv实例

import time
from multiprocessing import Semaphore
from multiprocessing import Process
def go_ktv(i,sem):
    sem.acquire()
    print("%s进了ktv"%i)
    time.sleep(1)
    print("%s出了ktv"%i)
    sem.release()
if __name__ == "__main__":
    sem=Semaphore(4)
    for i in range(10):
        p=Process(target=go_ktv,args=(i,sem))
        p.start()
View Code

三.Event 事件

e=Event()全局定义了一个事件e
创建时状态默认为False
set和clear 分别修改一个事件的状态 True False
is_set查看事件的状态 wait 根据事件的状态决定是否阻塞
全局定义了一个“Flag”,如果“Flag”值为 False那么当程序执行 event.wait 方法时就会阻塞,
如果“Flag”值为True,那么event.wait 方法时便不再阻塞。
from multiprocessing import Event
e=Event()
print(e.is_set())
e.wait()
print(666)
#set.clear() ###
e=Event()
print(e.is_set())
e.set() 将“Flag”设置为True
e.wait()
print(666)
e.clear()  将“Flag”设置为False
e.wait()  #不用e.wait 会正常显示
print(777)
View Code
红绿灯实例
from multiprocessing import Event,Process
import time
import random
def car(e,i):
    if not e.is_set():
        print("33[31m%s在等待33[0m"%i)
        e.wait()
    print("33[32m%s在通过33[0m"%i)
def light(e):
    while True:
       if e.is_set():
           e.clear()
           print("33[31m红灯亮33[0m")
       else:
           e.set()
           print("33[32m绿灯亮33[0m")
       time.sleep(2)
if  __name__ == "__main__":
    e=Event()
    p=Process(target=light,args=(e,))
    p.start()
    for i in range(10):
        cars=Process(target=car,args=(e,i))
        cars.start()
        time.sleep(random.randint(1,3))
View Code
 
原文地址:https://www.cnblogs.com/zgf-666/p/8659921.html