zoukankan      html  css  js  c++  java
  • python 进程间通信

    1. 不能使用python自带的queue进行通信,不然无法接受到数据

    from queue import Queue
    
    def producer(queue):
        queue.put("a")
        time.sleep(2)
    
    def consumer(queue):
        time.sleep(2)
        data = queue.get()
        print(data)
    
    if __name__ == "__main__":
        queue = Queue(10)
        my_producer = Process(target=producer, args=(queue,))
        my_consumer = Process(target=consumer, args=(queue,))
        my_producer.start()
        my_consumer.start()
        my_producer.join()
        my_consumer.join()

    2. 必须使用multiprocessing中的Queue

    import time
    from multiprocessing import Process, Queue, Pool, Manager, Pipe
    
    def producer(queue):
        queue.put("a")
        time.sleep(2)
    
    def consumer(queue):
        time.sleep(2)
        data = queue.get()
        print(data)
    
    if __name__ == "__main__":
        queue = Queue(10)
        my_producer = Process(target=producer, args=(queue,))
        my_consumer = Process(target=consumer, args=(queue,))
        my_producer.start()
        my_consumer.start()
        my_producer.join()
        my_consumer.join()

    3. 全局变量不适用于多进程编程,可以使用与多线程编程

    def producer(a):
        a += 100
        time.sleep(2)
    
    def consumer(a):
        time.sleep(2)
        print(a)
    
    if __name__ == "__main__":
        a = 1
        my_producer = Process(target=producer, args=(a,))
        my_consumer = Process(target=consumer, args=(a,))
        my_producer.start()
        my_consumer.start()
        my_producer.join()
        my_consumer.join()

    4. multiprocessing中的queue不能用于pool进程池, pool中的进程间通信需要使用manager中的queue

    def producer(queue):
        queue.put("a")
        time.sleep(2)
    
    def consumer(queue):
        time.sleep(2)
        data = queue.get()
        print(data)
    
    if __name__ == "__main__":
        queue = Manager().Queue(10)
        pool = Pool(2)
    
        pool.apply_async(producer, args=(queue,))
        pool.apply_async(consumer, args=(queue,))
    
        pool.close()
        pool.join()

    5. 通过pipe实现进程间通信,pipe的性能高于queue,因为queque中加了锁

    def producer(pipe):
        pipe.send("bobby")
    
    def consumer(pipe):
        print(pipe.recv())
    
    if __name__ == "__main__":
        recevie_pipe, send_pipe = Pipe()
        #pipe只能适用于两个进程
        my_producer= Process(target=producer, args=(send_pipe, ))
        my_consumer = Process(target=consumer, args=(recevie_pipe,))
    
        my_producer.start()
        my_consumer.start()
        my_producer.join()
        my_consumer.join()

    6. 多线程可以想用共享变量,但是必须使用Manager中的dict

    def add_data(p_dict, key, value):
        p_dict[key] = value
    
    if __name__ == "__main__":
        progress_dict = Manager().dict()
    
        first_progress = Process(target=add_data, args=(progress_dict, "bobby1", 22))
        second_progress = Process(target=add_data, args=(progress_dict, "bobby2", 23))
    
        first_progress.start()
        second_progress.start()
        first_progress.join()
        second_progress.join()
    
        print(progress_dict)
  • 相关阅读:
    多网卡绑定
    deepin 20.2.3 数字时钟屏保
    (原创)odoo15(master)下,列表导出权限控制
    在CentOS7上扩容centos-root根目录
    Linux扩容-新增磁盘分区挂载-fdisk
    Docker
    隐私政策(URL)
    快排代码
    反射将对象所有属性(含集合中所有属性)中字符串类型做trim()
    Prometheus 查询语句
  • 原文地址:https://www.cnblogs.com/callyblog/p/11180960.html
Copyright © 2011-2022 走看看