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)

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

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

  • 相关阅读:
    JavaScript 将数组中具有相同值的对象 取出组成新的数组
    css样式初始化
    javaScript如何跳出多重循环break、continue
    vue-cli中webpack配置解析
    Invalid prop: type check failed for prop "XXX". Expected String, got Object.
    vue-cli构建项目添加网站ico的logo
    vue-cli构建的vue项目打包后css引入的背景图路径不对的问题
    从零开始使用vue-cli搭建一个vue项目及注意事项
    安装npm及cnpm(Windows)
    面试题8:旋转数组中的最小数字
  • 原文地址:https://www.cnblogs.com/msj513/p/9952744.html
Copyright © 2011-2022 走看看