# 场景:
# 4个ktv房间
# 10 个人 轮流去唱歌
import random
import time
from multiprocessing import Semaphore,Process,Queue

def ktv_sing(person,sem,queue):
    sem.acquire()         # 相当于获得锁的一把钥匙,然后打开锁 执行 锁住的代码,执行完毕后,锁住代码,归还钥匙
    roomNum = queue.get()
    print(f'\033[31m{person}走进ktv{roomNum}房间\033[m',time.strftime("%Y-%m-%d %H:%M:%S"))
    time.sleep(random.randint(1,5))
    print(f'\033[32m{person}走出ktv{roomNum}房间\033[m',time.strftime("%Y-%m-%d %H:%M:%S"))
    queue.put(roomNum)
    sem.release()   # 执行完锁住的代码,归还钥匙
if __name__ == '__main__':
    queue = Queue(4)        # 通过队列实现进程间通信,
    for i in range(1,5):       # 将四个房间号放入队列中去
        queue.put(i)
    sem = Semaphore(4)   # 信号量类,就是创建一个有多把钥匙的钥
    for i in range(1,11):
        p = Process(target=ktv_sing,args=("person%s" % i,sem,queue))
        p.start()

# 程序执行结果:
# person2走进ktv1房间 2018-09-19 17:27:20
# person4走进ktv2房间 2018-09-19 17:27:20
# person1走进ktv3房间 2018-09-19 17:27:20
# person3走进ktv4房间 2018-09-19 17:27:20
# person4走出ktv2房间 2018-09-19 17:27:23
# person1走出ktv3房间 2018-09-19 17:27:23
# person5走进ktv2房间 2018-09-19 17:27:23
# person6走进ktv3房间 2018-09-19 17:27:23
# person5走出ktv2房间 2018-09-19 17:27:24
# person7走进ktv2房间 2018-09-19 17:27:24
# person3走出ktv4房间 2018-09-19 17:27:24
# person8走进ktv4房间 2018-09-19 17:27:24
# person2走出ktv1房间 2018-09-19 17:27:25
# person9走进ktv1房间 2018-09-19 17:27:25
# person8走出ktv4房间 2018-09-19 17:27:25
# person10走进ktv4房间 2018-09-19 17:27:25
# person9走出ktv1房间 2018-09-19 17:27:28
# person6走出ktv3房间 2018-09-19 17:27:28
# person10走出ktv4房间 2018-09-19 17:27:28
# person7走出ktv2房间 2018-09-19 17:27:29

 # def acquire(self, blocking=True, timeout=None):
 #        pas

 

posted on 2018-09-19 17:30  yellwonfin  阅读(164)  评论(0)    收藏  举报