zoukankan      html  css  js  c++  java
  • 网络编程之进阶

    ---恢复内容开始---

    1、互斥锁

    2、进程间通信

    3、生成者消费者模型

    1互斥锁

    from multiprocessing import Process,Lock
    import os
    import time
    def work(mutex):#传入一个锁
        mutex.acquire()#获得一个锁
        print('task[%s] 上厕所' %os.getpid())#运行
        time.sleep(3)#睡眠三秒
        print('task[%s] 上完厕所' %os.getpid())#运行
        mutex.release()#释放锁
    
    if __name__ == '__main__':
        mutex=Lock()#实例化一个锁
        p1=Process(target=work,args=(mutex,))#实例化一个进程
        p2=Process(target=work,args=(mutex,))#实例化一个进程
        p3=Process(target=work,args=(mutex,))#实例化一个进程
        p1.start()#启动
        p2.start()#启动
        p3.start()#启动
        print('')
        
    #给子线程加上锁:就相当于子线程是串行的。

    2、进程间通信

    模拟抢票系统(这个版本每次只能一个进程使用)

    #残次版
    from multiprocessing import Process,Lock
    import json
    import time
    import random
    import os
    def task(mutex):
        mutex.acquire()#获得锁
        dic=json.load(open('db.txt'))#反序列化文件
        print('剩余票数%s' %dic['count'])#打印剩余票数
        if dic['count'] > 0:#判断是有剩余的票数
            dic['count']-=1#票数减一
            time.sleep(random.randint(1,3))#睡眠一段时间
            json.dump(dic,open('db.txt','w'))#序列化保存
            print('%s 购票成功' %os.getpid())#打印购票成功
        mutex.release()#释放锁
    
    if __name__ == '__main__':
        mutex=Lock()#生成一个锁
        for i in range(2):#循环2次
            p=Process(target=task,args=(mutex,))#生成一个线程
            p.start()#启动

    模拟抢票软件完整版

    from multiprocessing import Process,Lock
    import json
    import time
    import random
    import os
    def search():#定义查询票数
        dic=json.load(open('db.txt',))#反序列化数据
        print('剩余票数%s' %dic['count'])#查看剩余的票数
    
    def get_ticket():#定义购票的函数
        dic=json.load(open('db.txt',))#反序列化数据
        if dic['count'] > 0:#判断是否有票
            dic['count']-=1#票数减一
            json.dump(dic,open('db.txt','w'))#序列化数据
            print('%s 购票成功' %os.getpid())#打印哪个进程购票
    def task(mutex):
        search()#查询时
        time.sleep(random.randint(1, 3)) #模拟购票一系列繁琐的过程所花费的时间
        mutex.acquire()#获得一个进程锁
        get_ticket()#购票
        mutex.release()#释放锁
    if __name__ == '__main__':
        mutex=Lock()#实例化一个锁
        for i in range(5):
            p=Process(target=task,args=(mutex,))#一个进程
            p.start()#启动一个进程

    3、生成者和消费者模型

    队列:

    from multiprocessing import Process,Queue
    #1:可以往队列里放任意类型的数据 2 队列:先进先出
    q=Queue(3)
    q.put('first')
    q.put('second')
    q.put('third')
    # q.put('fourht',block=False)#不是默认值就会报错
    q.put('fourht')#是默认值就会夯住
    
    print(q.get())
    print(q.get())
    print(q.get())

    一个生成者和一个消费者模型

    # from multiprocessing import Process,Queue
    # import time
    # import random
    # import os
    # def consumer(q):
    #     while True:
    #         res=q.get()
    #         if res is None:
    #             break
    #         time.sleep(random.randint(1,3))
    #         print('33[45m%s 吃了 %s33[0m' % (os.getpid(), res))
    # def producer(q):
    #     for i in range(5):
    #         time.sleep(2)
    #         res='包子%s' %i
    #         q.put(res)
    #         print('33[44m%s 制造了 %s33[0m' %(os.getpid(),res))
    #     q.put(None)
    # if __name__ == '__main__':
    #     q=Queue()
    #     #生产者们:厨师们
    #     p1=Process(target=producer,args=(q,))
    #
    #     #消费者们:吃货们
    #     p2=Process(target=consumer,args=(q,))
    #     p1.start()
    #     p2.start()
    #     p1.join()#
    #     p2.join()#运行完后才会执行下面的
    #     print('主')

    多个生成者和多个消费者

    #几个消费者,有几个None
    from multiprocessing import Process,Queue
    import time
    import random
    import os
    def consumer(q):
        while True:
            res=q.get()
            if res is None:break
            time.sleep(random.randint(1,3))
            print('33[45m%s 吃了 %s33[0m' % (os.getpid(), res))
    def product_baozi(q):
        for i in range(3):
            time.sleep(2)
            res='包子%s' %i
            q.put(res)
            print('33[44m%s 制造了 %s33[0m' %(os.getpid(),res))
    def product_gutou(q):
        for i in range(3):
            time.sleep(2)
            res='骨头%s' %i
            q.put(res)
            print('33[44m%s 制造了 %s33[0m' %(os.getpid(),res))
    def product_ganshui(q):
        for i in range(3):
            time.sleep(2)
            res='泔水%s' %i
            q.put(res)
            print('33[44m%s 制造了 %s33[0m' %(os.getpid(),res))
    if __name__ == '__main__':
        q=Queue()
        #生产者们:厨师们
        p1=Process(target=product_baozi,args=(q,))
        p2=Process(target=product_gutou,args=(q,))
        p3=Process(target=product_ganshui,args=(q,))
        #消费者们:吃货们
        p4=Process(target=consumer,args=(q,))
        p5=Process(target=consumer,args=(q,))
        p_l=[p1,p2,p3,p4,p5]
        for p in p_l:
            p.start()
        #
        # for p in p_l:
        #     p.join()
    
        #
        # p1.start()
        # p2.start()
        # p3.start()
        # p4.start()
        # p5.start()
    
    
        p1.join()
        p2.join()
        p3.join()
        q.put(None)
        q.put(None)
        p4.join()
        p5.join()
        print('主')
     

    另一种方法写一个生成者和一个消费者

    from multiprocessing import Process,JoinableQueue
    import time
    import random
    import os
    def consumer(q):
        while True:
            res=q.get()
            time.sleep(random.randint(1,3))
            print('33[45m%s 吃了 %s33[0m' % (os.getpid(), res))
            q.task_done()#接收一个,它会返回一个值给生成者
    
    def product_baozi(q):
        for i in range(5):
            time.sleep(2)
            res='包子%s' %i
            q.put(res)
            print('33[44m%s 制造了 %s33[0m' %(os.getpid(),res))
        q.join()
    
    if __name__ == '__main__':
        q=JoinableQueue()
        #生产者们:厨师们
        p1=Process(target=product_baozi,args=(q,))
        #消费者们:吃货们
        p4=Process(target=consumer,args=(q,))
        p4.daemon=True#守护进程主进程结束它也结束
        p1.start()
        p4.start()
    
        p1.join()#等p1运行完
        print('')

    多个生成者与消费者

    from multiprocessing import Process,JoinableQueue
    import time
    import random
    import os
    def consumer(q):
        while True:
            res=q.get()
            time.sleep(random.randint(1,3))
            print('33[45m%s 吃了 %s33[0m' % (os.getpid(), res))
            q.task_done()
    
    def product_baozi(q):
        for i in range(3):
            time.sleep(2)
            res='包子%s' %i
            q.put(res)
            print('33[44m%s 制造了 %s33[0m' %(os.getpid(),res))
        q.join()
    
    def product_gutou(q):
        for i in range(3):
            time.sleep(2)
            res='骨头%s' %i
            q.put(res)
            print('33[44m%s 制造了 %s33[0m' %(os.getpid(),res))
        q.join()
    
    def product_ganshui(q):
        for i in range(3):
            time.sleep(2)
            res='泔水%s' %i
            q.put(res)
            print('33[44m%s 制造了 %s33[0m' %(os.getpid(),res))
        q.join()
    if __name__ == '__main__':
        q=JoinableQueue()
        #生产者们:厨师们
        p1=Process(target=product_baozi,args=(q,))
        p2=Process(target=product_gutou,args=(q,))
        p3=Process(target=product_ganshui,args=(q,))
    
        #消费者们:吃货们
        p4=Process(target=consumer,args=(q,))
        p5=Process(target=consumer,args=(q,))
        p4.daemon=True
        p5.daemon=True
    
        p_l=[p1,p2,p3,p4,p5]
        for p in p_l:
            p.start()
    
        p1.join()
        p2.join()
        p3.join()
    
        print('')

    ---恢复内容结束---

  • 相关阅读:
    给定一个十进制数M,以及需要转换的进制数N。 将十进制数M转化为N进制数
    java计算两条线段交点
    输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m 转载
    全排列 (递归求解+字典序) java 转载
    四大线程池详解(转载)
    生产者消费者简单实现(转载)
    进程 线程通信方式(转载)
    匿名对象和类名为数据类型(java)
    星星(java)
    杨辉三角(java)
  • 原文地址:https://www.cnblogs.com/1a2a/p/7444446.html
Copyright © 2011-2022 走看看