zoukankan      html  css  js  c++  java
  • 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到。
  • 相关阅读:
    架构漫谈1
    如何将本地工程上传到github
    寒假日报day23
    寒假日报----首都之窗爬虫大作业
    寒假日报day22
    寒假日报day21
    关于webmagic的post请求
    寒假日报day20
    寒假日报day19
    吾日三省吾身(41)
  • 原文地址:https://www.cnblogs.com/python-daxiong/p/12142737.html
Copyright © 2011-2022 走看看