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('')
  • 相关阅读:
    网络卖家自曝黑幕 “信用刷手”欺骗你 狼人:
    卡巴斯基:2009年恶意软件发展情况将持续恶化 狼人:
    微软证实云计算平台暂时中断 显现安全弊端 狼人:
    工程目录Maven安装配置及其插件m2e(Eclipse Indigo 和 MyEclipse8.5)的安装配置
    文件系统crondsendmailpostdrop导致Linux定期死掉的完整解决过程实录
    汇编语言处理器面向机器的编程语言 : 汇编语言:如果自己要发明一种编程语言,那么需要做些什么事情呢?
    包解密腾讯手机管家ROOT功能分析
    nullnullhdu 2608
    按钮下载Eclipse Color Theme
    控件学习IOS开源项目(1)之RatingView星级评论控件学习
  • 原文地址:https://www.cnblogs.com/1a2a/p/7428759.html
Copyright © 2011-2022 走看看