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)

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

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

  • 相关阅读:
    NET性能优化方面的总结
    SVN 全局忽略列表
    Visual Studio 2005 IDE Themes
    如何编写网络监视器
    微软研究院Detour开发包之API拦截技术
    NDIS HOOK实现方法
    如何使用MAP文件找到程序崩溃时源码是哪行异常
    QT 环境变量设置
    Winsock工作模型 ( 转 )
    如何使用MAP文件找到程序崩溃的原因
  • 原文地址:https://www.cnblogs.com/msj513/p/9952744.html
Copyright © 2011-2022 走看看