zoukankan      html  css  js  c++  java
  • 并发编程之线程池与进程池

    Python标准模块--concurrent.futures

    基本介绍

    #1 介绍
    concurrent.futures模块提供了高度封装的异步调用接口
    ThreadPoolExecutor:线程池,提供异步调用
    ProcessPoolExecutor: 进程池,提供异步调用
    Both implement the same interface, which is defined by the abstract Executor class.
    
    #2 基本方法
    #submit(fn, *args, **kwargs)
    异步提交任务
    
    #map(func, *iterables, timeout=None, chunksize=1) 
    取代for循环submit的操作
    
    #shutdown(wait=True) 
    相当于进程池的pool.close()+pool.join()操作
    wait=True,等待池内所有任务执行完毕回收完资源后才继续
    wait=False,立即返回,并不会等待池内的任务执行完毕
    但不管wait参数为何值,整个程序都会等到所有任务执行完毕
    submit和map必须在shutdown之前
    
    #result(timeout=None)
    取得结果
    
    #add_done_callback(fn)
    回调函数# done()判断某一个线程是否完成# cancle()取消某个任务

    ThreadPoolExecutor的使用

    from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
    import time
    import os
    
    # 括号内, 可以传数字, 不传的话默认会开设当前计算机cpu个数5倍的线程
    pool = ThreadPoolExecutor(5)  # 池子里面固定只有五个线程
    """
    线程池造出来之后, 里面会固定存在五个线程, 这五个线程不会出现重复创建和销毁的过程
    """
    """
    池子的使用非常简单:
        你只需要将需要做的任务往池子中提交即可, 自动会有人来服务你
    """
    
    
    def task(n):
        print(n)
        print(os.getpid())
        time.sleep(2)
    
        return n * 2"""
    任务的提交方式:
        同步: 提交任务之后原地等待任务的返回结果, 期间不做任何事
        异步: 提交任务之后不等待任务的返回结果, 继续往下执行
    """
    t_list = []
    # pool.submit(task, 1)  # 向池子中提交任务  异步提交
    for i in range(20):  # 朝池子中提交20个任务
        res = pool.submit(task, i)
        # print(res.result())
        """
        res.result()
        程序由并发变成了串行,
        任务为什么打印的是None,
        res.result()拿到的是异步提交的任务的返回结果
        """
        t_list.append(res)
    
    # 等待线程池中所有的任务执行完毕之后再进行往下执行
    pool.shutdown()  # 关闭线程池, 等待线程池中所有的任务运行完毕
    
    for t in t_list:
        print('>>>:', t.result())
    
    """
    异步任务的返回结果应该通过回调机制来操作
    """

    ProcessPoolExecutor的使用

    from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
    import time
    import os
    
    # 括号内, 可以传数字, 不传的话默认会开设当前计算机cpu个数5倍的线程
    # pool = ThreadPoolExecutor(5)  # 池子里面固定只有五个线程
    pool = ProcessPoolExecutor(5)
    """
    线程池造出来之后, 里面会固定存在五个线程, 这五个线程不会出现重复创建和销毁的过程
    """
    """
    池子的使用非常简单:
        你只需要将需要做的任务往池子中提交即可, 自动会有人来服务你
    """
    
    
    def task(n):
        print(n)
        print(os.getpid())
        time.sleep(2)
    
        return n * 2
    
    def call_back(n):
        print('call_back',n.result)
    
    """
    任务的提交方式:
        同步: 提交任务之后原地等待任务的返回结果, 期间不做任何事
        异步: 提交任务之后不等待任务的返回结果, 继续往下执行
    """
    t_list = []
    # pool.submit(task, 1)  # 向池子中提交任务  异步提交
    for i in range(20):  # 朝池子中提交20个任务
        res = pool.submit(task, i).add_done_callback(call_back)
        # print(res.result())
        """
        res.result()
        程序由并发变成了串行,
        任务为什么打印的是None,
        res.result()拿到的是异步提交的任务的返回结果
        """
        t_list.append(res)
    
    # 等待线程池中所有的任务执行完毕之后再进行往下执行
    pool.shutdown()  # 关闭线程池, 等待线程池中所有的任务运行完毕
    
    for t in t_list:
        print('>>>:', t.result())
    
    """
    异步任务的返回结果应该通过回调机制来操作
    """
  • 相关阅读:
    (转)asp.net页面出错时的处理方法
    Angular.js学习笔记 (二) H.U.C
    一套常用的css初始化样式 H.U.C
    hexo工具介绍及使用方法 H.U.C
    Angular.js学习笔记 (一) H.U.C
    Nhibernate 对view 查询的几种方法
    如何做类似google的Textbox的AutoComplete增强版,可以显示多列
    POS 打印机编程控制
    (转) 商品损耗控制
    win 2008 IIS 7 安装 PHPMYAdmin
  • 原文地址:https://www.cnblogs.com/featherwit/p/13391643.html
Copyright © 2011-2022 走看看