python语法基础-并发编程-进程-其他

###############    多进程的信号量    ##############

# 多进程的信号量

from multiprocessing import Process
import time,random
from multiprocessing import Semaphore
# ktv只有1个房间,1个房间只能装4个人,但是这样写就是20个人都进入到房间了,
# 假设ket门口有4把钥匙,一个进程来了那一把钥匙,然后关门,这样只有4个进程能拿到,剩下的之后1个进程出来了才可以继续其他的进程,
# 这个概念就叫做信号量,同一时间就只有四个人,
def ktv(i,sem):
    sem.acquire()  # 获取钥匙
    print("%d进入ktv"%i)
    time.sleep(random.randint(60,180))  # 这是每一个人唱歌1-3分钟
    print("%d走出ktv"%i)
    sem.release()  # 还钥匙

if __name__ == "__main__":
    sem = Semaphore(4)  # 这就是设置有多少把钥匙,  信号量的英文就是:Semaphore
    for i in range(20):
        p=Process(target=ktv,args=(i,sem))
        p.start()

###############    进程的事件    ##############

# 进程的事件


# 事件
import time
from multiprocessing import Event, Process


# 一个信号,可以使所有的进程都进入阻塞状态,也可以控制所有信号都解除阻塞,
# 一个事件创建之后,默认是阻塞状态,
# e = Event()  # 创建一个事件
# print(e.is_set())  # 查看一个事件是否是阻塞状态,
# print(123445)
# e.set()  # 这是把阻塞的状态改为true,
# print(e.is_set())
# e.wait()  # 根据e.is_set()的结果,如果是false,就会阻塞,如果是true就会不阻塞
# print(12344)
# e.clear()  # 这是把阻塞的状态改为false
# print(e.is_set())
# e.wait()  # 虽然阻塞了,但是一定要有这个wait,才会阻塞后面的代码,
# print(444444)


# 举一个例子,红绿灯

# 每一个进程表示一辆车,
def car(e,i):
    #e.is_set() 默认返回False 代表的是绿灯
    if not e.is_set():
        print("car%s在等待"%i)
        e.wait()
    print("car%s通行了"%i)

def light(e):
    while True:
        if e.is_set():
            e.clear()
            print('\033[31m红灯亮了\033[0m')
        else:
            e.set()
            print('\033[32m绿灯亮了\033[0m')
        time.sleep(2)


if __name__ == '__main__':
    e=Event()
    # 模拟启动交通灯
    p1=Process(target=light,args=(e,))
    p1.daemon=True
    p1.start()
    #模拟20辆小车
    for i in range(20):
        import random
        time.sleep(random.uniform(0,2))
        p2=Process(target=car,args=(e,i))
        p2.start()
    print("程序彻底结束!")

猜你喜欢

转载自www.cnblogs.com/andy0816/p/12375736.html
今日推荐