• 9.16(day37)进程锁,队列(Queue),JoinableQueue用法,初识线程


    进程锁

    lock.acquire() 锁住

    lock.release() 释放锁头

    进程锁:把锁住的代码变成串行

    join:把全部代码变成串行

    为了保证数据的安全,串行牺牲掉效率

    队列(Queue)

    队列:pipe+锁 Queue(不适合传大文件,通常传一些消息)

    ipc机制:进程通讯

    管道:pipe基于共享的内存空间

    具体用法:
    from multiprocessing import Process,Queue
    
    q = Queue()   # 空队列,可放数字控制队列大小,
    q.put('zhang')
    q.put('jian')   # 放入,超过队列大小是会阻塞
    # q.put(对象,block=True,timeout=)   第一个参数为放入的数据,第二个参数默认为True,表示如果放入的时候满了等待,timeout控制阻塞时间,单位秒,超过时间没有执行会报错
    
    q.get()
    q.get()
    q.get()   # 取值,没有的时候回等待,会阻塞
    q.get(对象,block=True,timeout=)   第一参数数据,第二参数表示没有东西会等待,timeout等待时间,超过没有去处东西会报错
    
    block = False,当放入是队列满了,或者去时队列空了直接报错
    
    q.get_nowait()    表示不等待,相当于q.get(block = False,)
    q.put_nowait()    表示不等待,相当于q.put(block = False,)
    
    

    生产者消费者模型

    生产者:生产数据

    消费者:处理数据

    生产者---队列---消费者

    生产者可以不停的生产达到在自己最大的生产效率

    生产者消费者模型提高了生产者生产的效率和

    第一代
    from multiprocessing import Process, Queue
    
    def producer(q,name,food):
        for i in range(10):
            print(f'{name}生产了{food}{i}')
            res = f'{food}{i}'
            q.put(res)
        q.put(None)
    
    
    def consumer(q,name):
        while True:
            res = q.get(timeout=5)
            if res is None:
                break
            print(f'{name}吃了{res}')
    
    
    if __name__ == '__main__':
        q = Queue()
        p1 = Process(target=producer, args=(q, 'zjh', '包子'))
        c1 = Process(target=consumer,args=(q,'zj'))
        p1.start()
        c1.start()
        q.put(None)
    
    
    第二代
    from multiprocessing import Process,Queue
    import time,random
    def producer(q,name,food):
        for i in range(3):
            print(f'{name}生产了{food}{i}')
            time.sleep(random.randint(1,3))
            res = f'{food}{i}'
            q.put(res)
    
    def consumer(q,name):
        while True:
            res = q.get(timeout = 5)
            if res is None:
                break
            time.sleep(random.randint(1,3))
            print(f'{name}吃了{res}')
    
    if __name__ == '__main__':
        q = Queue()
        p1 = Process(target=producer(q,'lqz','baozi'))
        p2 = Process(target=producer(q,'nick','xie'))
        p3 = Process(target=producer(q,'rockey','dabing'))
        c1 = Process(target=consumer(q,'qxp'))
        c2 = Process(target=consumer(q,'dgq'))
        p1.start()
        p2.start()
        p3.start()
        c1.start()
        c2.start()
        p1.join()
        p2.join()
        p3.join()
        q.put(None)
        q.put(None)
    
    
    第三代
    from multiprocessing import Process,Queue,JoinableQueue
    import time,random
    
    def producer(q,name,food):
        for i in range(3):
            print(f'{name}生产了{food}{i}')
            time.sleep(random.randint(1,3))
            res = f'{food}{i}'
            q.put(res)
    
    def consumer(q,name):
        while True:
            res = q.get()
            time.sleep(random.randint(1,3))
            print(f'{name}吃了{res}')
            q.task_done()
    
    if __name__ == '__main__':
        q = JoinableQueue()
        p1 = Process(target=producer, args=(q, 'rocky', '包子'))
        p2 = Process(target=producer, args=(q, 'mac', '韭菜'))
        p3 = Process(target=producer, args=(q, 'nick', '蒜泥'))
        c1 = Process(target=consumer, args=(q, '成哥'))
        c2 = Process(target=consumer, args=(q, '浩南哥'))
        p1.start()
        p2.start()
        p3.start()
        c1.daemon = True
        c2.daemon = True
        c1.start()
        c2.start()
        p1.join()
        p2.join()
        p3.join()
        q.join()
    
    
    

    JoinableQueue用法

    from multiprocessing import Process,Queue,JoinableQueue
    
    q = JoinableQueue()
    q.put('zhang')   # 放入一次任务
    q.put('jian')
    print(q.get())
    q.task_done()    # 完成了一次任务
    print(q.get())
    q.task_done()
    q.join()   # 计数器不为0时,阻塞等待计数器为0
    
    
    

    初识线程

    线程:代码的运行过程,cpu最小的执行单位

    传统操作系统中,每个进程都有一个地址空间,而且默认就有一个控制线程

    在工厂中,每个车间都有房子,每个车间默认就有一条流水线

    操作系统---工厂

    进程---车间(线程加资源单位)

    线程---(流水线)

    cpu---(电源)

    线程执行 = 运行代码

    进程:资源集合,资源单位

    进程运行 = 各种资源+线程

  • 相关阅读:
    spring 中的@Import注解和@ImportResource注解
    注意@Bean中的initMethod和destroyMethod
    AnnotationConfigApplicationContext.的用法的核心代码
    JSR330的注解和spring的原生注解的比较
    用JSR的@Inject代替@Autowired完成自动装配
    用@Component注解代替@Configuration注解,定义bean
    用filters定制化spring的包扫描
    linux 别名设置
    Vmware workstation 安装解压 vmwaretools 提示只读文件
    linux 基础
  • 原文地址:https://www.cnblogs.com/jiann/p/11529590.html
Copyright © 2020-2023  润新知