• day39-进程-队列


    #队列Queue:进程之间数据是隔离的,不共享的,但是通过multiprocessing的Queue可以实现进程之间的通信。
    #1、先进先出:把1 2 3放到队列里,按1 2 3的顺序拿出来。
    from multiprocessing import Queue
    q = Queue()
    q.put(1)
    q.put(2)
    q.put(3)
    print(q.get())
    print(q.get())
    print(q.get())
    # 1
    # 2
    # 3
    
    #2、当队列没有值时,继续使用print(q.get())会导致进程阻塞:执行代码之后不会出现Process finished with exit code 0
    from multiprocessing import Queue
    q = Queue()
    q.put(1)
    q.put(2)
    q.put(3)
    print(q.get())
    print(q.get())
    print(q.get())
    print(q.get()) #阻塞。
    
    #3、另外一种阻塞的情况是,实例化对象的长度不等于放进的长度:
    from multiprocessing import Queue
    q = Queue(3)   #对象长度是3,也就是最多有3个元素。当放入多于3个元素,就会阻塞。
    q.put(1)
    q.put(2)
    q.put(3)
    q.put(4) #放入第4个元素,阻塞,下面的代码无法运行。
    print(q.get())
    
    #4、实现主进程跟子进程之间的通信:主进程可以拿到子进程放入的hello:
    from multiprocessing import Queue
    from multiprocessing import Process
    def q_put(q):
        q.put('hello')
    
    if __name__ == '__main__':
        q = Queue()
        p = Process(target=q_put,args=(q,))
        p.start()
        print(q.get()) #主进程可以拿到子进程放入的hello
    #hello
    
    #5、子进程跟子进程之间的通信:
    from multiprocessing import Process
    from multiprocessing import Queue
    def q_put(q):
        q.put('hello')
    
    def q_get(q):  #拿到另外一个子进程放入的hello,实现子进程跟子进程之间的通信。
        print(q.get())
    
    if __name__ == '__main__':
        q = Queue()
        p = Process(target=q_put,args=(q,))
        p.start()
        p1 = Process(target=q_get,args=(q,))
        p1.start()
    # hello
    
    #6、生产者和消费者模型:以做包子为例:
    from multiprocessing import Queue
    from multiprocessing import Process
    import time
    def producer(q):  #生产者,做包子
        for i in range(100): #因为托盘只能放10个包子,消费者吃一个之后,生产者才生产一个。
            q.put(i)         #多于10的情况下,其他包子都在等待着生产。
    
    def consumer(q):
        for i in range(100):
            time.sleep(1)  #每个消费者一秒吃一个
            print(q.get())
    
    if __name__ == '__main__':
        q = Queue(10)    #托盘只能放10个包子。这样可以让内存存放比较少的数据。
        p = Process(target=producer,args=(q,))
        p.start()
        for i in range(5): #总共5个消费者
            p1 = Process(target=consumer,args=(q,))
            p1.start()
    
    #7、队列是双向通信的(比较少使用):producer put的同时也可以get到consunmer put的数据。consumer get的同时也可以put数据到队列里
    #被producer get到。
  • 相关阅读:
    js中 offset /client /scroll总结
    python的安装和环境配置
    git详解
    Xmind
    Linux 文件搜索命令
    Linux 文件和目录命令
    Linux 系统关机重启命令
    Linux系统信息命令
    Day07
    ModuleNotFoundError: No module named 'pysqlite2'
  • 原文地址:https://www.cnblogs.com/python-daxiong/p/12142737.html
Copyright © 2020-2023  润新知