zoukankan      html  css  js  c++  java
  • 异步回调

    为什么要异步回调?

     子进程帮助主进程完成任务

    处理任务的结果应该交还主进程

    其他方式也可以将数据交还给进程

    1.shutdown 主进程会等待所有任务完成

    2.result函数  会阻塞直到任务完成

    特点:都会阻塞,导致效率降低,所有使用回调

     shutdown

    from concurrent.futures import ProcessPoolExecutor
    
    #shutdown
    def task():
        print("这是task1的执行结果")
    
    if __name__ == '__main__':
    
        p = ProcessPoolExecutor()
        for i in range(5):
            p.submit(task)
        p.shutdown()#相当进程池为全体加上join
        print("aaaa")

    result

    def task():
        print("这是task1的执行结果")
        return "task1"
    
    if __name__ == '__main__':
    
        p = ProcessPoolExecutor()
        for i in range(5):
            f=p.submit(task)
            print(f.result())#result效果,等待进程执行完成,才能得到返回值
        # p.shutdown()#相当进程池为全体加上join
    
        print("aaaa")
    “”“
    这是task1的执行结果
    task1
    这是task1的执行结果
    task1
    这是task1的执行结果
    task1
    这是task1的执行结果
    task1
    这是task1的执行结果
    task1
    aaaa
    ”“”

    那么使用异步回调即可达到

    from concurrent.futures import ProcessPoolExecutor
    import time
    import os
    
    def task():
        print("生产者正在工作")
        time.sleep(0.1)
        return os.getpid()
    
    
    #处理者
    def task1(data):
        """
    
        :param data:
        :return:
        """
        print("处理者正在工作")
        print(data.result())
    
    
    if __name__ == '__main__':
         for i in range(10):
             p = ProcessPoolExecutor()
             f= p.submit(task)
             f.add_done_callback(task1)
    from concurrent.futures import ThreadPoolExecutor
    from threading import current_thread
    import time
    import os
    
    def task():
        print("生产者正在工作 %s"%current_thread())
        time.sleep(0.1)
        return os.getpid()
    
    
    #处理者
    def task1(data):
        """
    
        :param data:
        :return:
        """
        print(current_thread())
        print("处理者正在工作")
        print(data.result())
    
    
    if __name__ == '__main__':
         for i in range(10):
             p = ThreadPoolExecutor()
             f= p.submit(task)
             f.add_done_callback(task1)

    回调函数在进程池与线程池的区别。

    回调函数是在进程池中就交由主进程执行,而在线程池中则是交由线程池中空闲函数执行

  • 相关阅读:
    使用 CountDownLatch 控制多个线程执行顺序
    define 与 inline
    虚函数 纯虚函数 抽象方法 接口
    [转]Android 超高仿微信图片选择器 图片该这么加载
    Android ImageView src与backgroud
    Android View绘制原理分析
    Android 5.0 Default SMS App以及运营商授权SMS App
    Android 5.0 双卡信息管理分析
    Android 5.1 AOSP 源码获取
    Android 5.0 Uicc框架分析
  • 原文地址:https://www.cnblogs.com/msj513/p/9952744.html
Copyright © 2011-2022 走看看