zoukankan      html  css  js  c++  java
  • 并发编程,进程

    守护进程:

    什么是守护进程那,守护进程就像太监一样,一直守护皇上,等皇帝死了,他也要陪葬

    保随主进程一生,主进程死了,都给死

    from multiprocessing import Process
    
    
    def run(name):
        print('%s is runing'%name)
    
    if __name__ == '__main__':
        p=Process(target=run,args=('young friend',))
        # p.daemon = True
        p.start()
        print('主===》')#主===》
                        #young friend is runing
    
    
    def run(name):
        print('%s is runing'%name)
    
    if __name__ == '__main__':
        p=Process(target=run,args=('young friend',))
        p.daemon = True
        p.start()
        print('主===》')#主===》

    互斥锁:

    在多个子进程 诞生的时候 哪个子进程先抢到这个锁  哪个子进程就可以先执行(这个锁每次只能一个人用,进程结束后,会自动释放)

    from multiprocessing import Process,Lock
    #用join实现串行
    def task1():
        print('任务一,姓名:egon')
        print('任务一,年龄,18')
        print('任务一,性别:男')
    
    def task2():
        print('任务二,姓名:alex')
        print('任务二,年龄,78')
        print('任务二,性别:男')
    
    
    def task3():
        print('任务三,姓名:lxx')
        print('任务三,年龄,38')
        print('任务三,性别:男')
    
    
    if __name__ == '__main__':
        p1=Process(target=task1)
        p2 = Process(target=task2)
        p3 = Process(target=task3)
    
        p1.start()
        p1.join()
        p2.start()
        p2.join()
        p3.start()
        p3.join()
    
    
    
    #用互斥锁实现串行
    mutex=Lock()
    def task1(Lock):
        Lock.acquire()
        print('任务一,姓名:egon')
        print('任务一,年龄,18')
        print('任务一,性别:男')
        Lock.release()
    
    def task2(Lock):
        Lock.acquire()
        print('任务二,姓名:alex')
        print('任务二,年龄,78')
        print('任务二,性别:男')
        Lock.release()
    
    
    def task3(Lock):
        Lock.acquire()
        print('任务三,姓名:lxx')
        print('任务三,年龄,38')
        print('任务三,性别:男')
        Lock.release()
    
    
    if __name__ == '__main__':
        p1=Process(target=task1,args=(mutex,))
        p2 = Process(target=task2,args=(mutex,))
        p3 = Process(target=task3,args=(mutex,))
    
        p1.start()
        p2.start()
        p3.start()

    互斥锁与join的区别

    大前提:二者的原理都一样,都是将并发变成串行,从而保证有序

    区别:join是按照人为指定的顺序执行,而互斥锁是进程平等地竞争,谁先抢到谁执行

         互斥锁可以让一部分代码(修改共享数据的代码)串行,而join只能将代码整体串行

    模拟购票系统

    from multiprocessing import Process,Lock
    import time,random,json,os
    
    x=Lock()
    
    def select():
        time.sleep(random.randint(1, 3))
        dic=json.load(open('a.txt','r'))
        print('%s票还剩余%s张'%(os.getpid(),dic['count']))
    
    
    def get():
        dic = json.load(open('a.txt', 'r'))
        if dic['count']>0:
           dic['count']-=1
           time.sleep(random.randint(1, 3))
           json.dump(dic,open('a.txt','w'))
           print('%s抢票成功'%os.getpid())
    
    
    def lock_(Lock):
        select()
        Lock.acquire()
        get()
        Lock.release()
    
    if __name__ == '__main__':
        for i in range(10):
            p=Process(target=lock_,args=(x,))
            p.start()

    ICP通信机制:

    进程之间通信必须找到一种介质,该介质必须满足,

    1.是所有进程共享的

    2.必须是内存空间

    from multiprocessing import Queue
    
    # 对列:
    #1、共享的空间
    #2、是内存空间
    #3、自动帮我们处理好锁定问题
    q=Queue(3)
    q.put('first')
    q.put({'second':None})
    q.put('')
    
    # q.put(4) #阻塞
    print(q.get())
    print(q.get())
    print(q.get())

    强调:

    1.队列用来存成进程之间沟通的信息,数据量不应该过大

    2.maxsize的值超过的内存限制就变的毫无意义了

    生产者消费者模型
    该模型中包含两类重要的角色:
    1、生产者:将负责造数据的任务比喻为生产者
    2、消费者:接收生产者造出的数据来做进一步的处理,该类人物被比喻成消费者


     实现生产者消费者模型三要素
    1、生产者
    2、消费者
    3、队列

     什么时候用该模型:
    程序中出现明显的两类任何,一类任务是负责生产,另外一类任务是负责处理生产的数据的

     该模型的好处:
     1、实现了生产者与消费者解耦和
     2、平衡了生产力与消费力,即生产者可以一直不停地生产,消费者可以不停地处理,因为二者
    不再直接沟通的,而是跟队列沟通

    import time
    import random
    from multiprocessing import Process,Queue
    
    def consumer(name,q):
        while True:
            res=q.get()
            time.sleep(random.randint(1,3))
            print('33[46m消费者===》%s 吃了 %s33[0m' %(name,res))
    
    
    def producer(name,q,food):
        for i in range(5):
            time.sleep(random.randint(1,2))
            res='%s%s' %(food,i)
            q.put(res)
            print('33[45m生产者者===》%s 生产了 %s33[0m' %(name,res))
    
    
    if __name__ == '__main__':
        #1、共享的盆
        q=Queue()
    
        #2、生产者们
        p1=Process(target=producer,args=('egon',q,'包子'))
        p2=Process(target=producer,args=('刘清政',q,'泔水'))
        p3=Process(target=producer,args=('杨军',q,'米饭'))
    
        #3、消费者们
        c1=Process(target=consumer,args=('alex',q))
        c2=Process(target=consumer,args=('梁书东',q))
    
    
        p1.start()
        p2.start()
        p3.start()
        c1.start()
        c2.start()
    

      

  • 相关阅读:
    IOS UITextField 设置光标位置
    改变UITableViewCell按下去的颜色
    BZOJ 1217 [HNOI2003]消防局的设立
    BZOJ 3751 [NOIP2014]解方程
    BZOJ 4198 [Noi2015]荷马史诗
    BZOJ 4650 [Noi2016]优秀的拆分
    BZOJ 2434 [Noi2011]阿狸的打字机
    BZOJ 3563 DZY Loves Chinese
    1834 [ZJOI2010]network 网络扩容
    BZOJ 1079 [SCOI2008]着色方案
  • 原文地址:https://www.cnblogs.com/yftzw/p/8947879.html
Copyright © 2011-2022 走看看