| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 330 人关注过本帖
标题:消息队列,共享内存,信号量
只看楼主 加入收藏
zxq0103
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2023-3-10
结帖率:0
收藏
 问题点数:0 回复次数:0 
消息队列,共享内存,信号量
"""
    用信号量,消息队列,共享内存三种进程通信方式,模拟景区售票,入门和出门
    设景区内同时承载的游客人数上限为3,景区内售票排队人数最大上限为5
    此模拟并不科学,只是为了测试三种通信方式的用法,大神不要笑话
"""
def p_in(que,list_array,sem): # 游客入
    time.sleep(2)
    while not que.empty():
        data = que.get()
        # print(data)
        while data != '':
            for i in list_array:
                # print(i.get_obj().value)
                if i.get_obj().value == '游客名字初始化':
                    i.get_obj().value = data
                    time.sleep(0.1)
                    print("游客'%s'进入景区\n"%data)
                    sem.release()
                    data = ''
                    break
    print('游客已经全部进入\n')
        
def p_out(list_array,sem): # 游客出
    time.sleep(3)
    while True:
        for i in list_array:
            if i.get_obj().value != '游客名字初始化':
                time.sleep(randint(1,3)) # 游客逗留时间随机3-5秒
                time.sleep(0.1)
                print("游客'%s'出去了\n"%i.get_obj().value)
                i.get_obj().value = '游客名字初始化'
                sem.acquire()
        if sem.get_value() == 0:
            break
    print('游客已经走完了\n')
            
def p_ticket(list,que): # 售票
    print('开始售票。。。\n')
    for i in list:
        while True:
            if not que.full():
                print(i,'同学拿到门票\n')
                que.put(i)
                break
    print('票已售完!\n')           

def main():
    list_array = [Array('u','游客名字初始化') for i in range(3)]
    sem = Semaphore(0) # 出门处通过信号量是否为0判断游客是否出完
    que = Queue(5) # 消息队列5,进门处排队的最大人数
    print('主进程开始,准备初始化三个子进程')
    p0 = Process(target=p_ticket,args=(list,que)) # 排队售票
    p1 = Process(target=p_in,args=(que,list_array,sem)) # 游客排队进入
    p2 = Process(target=p_out,args=(list_array,sem)) # 游客随机出门
    p0.start()
    p1.start()
    p2.start()
    p0.join()
    p1.join()
    p2.join()
    print('主进程结束')

if __name__ == '__main__':
    list = ['小泽玛利亚','尼古拉斯凯奇','王八羔子','一夜十次郎','山口百惠',
            '王二麻子','司马光砸缸','神经有点病','钱多多','屎确实太浓']
    main()

运行结果:
主进程开始,准备初始化三个子进程
开始售票。。。

小泽玛利亚 同学拿到门票
尼古拉斯凯奇 同学拿到门票
王八羔子 同学拿到门票
一夜十次郎 同学拿到门票
山口百惠 同学拿到门票
王二麻子 同学拿到门票
游客'小泽玛利亚'进入景区
司马光砸缸 同学拿到门票
游客'尼古拉斯凯奇'进入景区
神经有点病 同学拿到门票
游客'王八羔子'进入景区
钱多多 同学拿到门票
游客'小泽玛利亚'出去了
游客'一夜十次郎'进入景区
屎确实太浓 同学拿到门票
票已售完!
游客'尼古拉斯凯奇'出去了
游客'山口百惠'进入景区
游客'王八羔子'出去了
游客'王二麻子'进入景区
游客'一夜十次郎'出去了
游客'司马光砸缸'进入景区
游客'山口百惠'出去了
游客'神经有点病'进入景区
游客'王二麻子'出去了
游客'钱多多'进入景区
游客'司马光砸缸'出去了
游客'屎确实太浓'进入景区
游客已经全部进入
游客'神经有点病'出去了
游客'钱多多'出去了
游客'屎确实太浓'出去了
游客已经走完了
搜索更多相关主题的帖子: value print 同学 data 售票 
2023-04-21 13:39
快速回复:消息队列,共享内存,信号量
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011991 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved