• 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)
  • 相关阅读:
    web安全记录
    jquery uploadify插件多文件上传
    在java中生成二维码,并直接输出到jsp页面
    条形码/二维码之开源利器ZXing图文介绍
    FCKeditor插件开发实例:uploadify多文件上传插件
    FCKeditor 插件开发 示例
    Spring技术_邮箱注册_激活_获取验证码
    jquery的uploadify上传jsp+servlet
    PHP变量类型
    thinkphp环境变量配置
  • 原文地址:https://www.cnblogs.com/callyblog/p/11180960.html
Copyright © 2020-2023  润新知