• PYTHON中的CONCURRENT.FUTURES模块


    一 : 概述

      concurrent.futures模块提供了高度封装的异步调用接口

      ThreadPoolExecutor:线程池,提供异步调用

      ProcessPoolExecutor: 进程池,提供异步调用

      两者都实现相同的接口,该接口由抽象执行器类定义。

    二 : 基本方法

      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) 添加回调函数 

     1 #介绍
     2 ProcessPoolExecutor类是一个Executor子类,它使用进程池异步执行调用。ProcessPoolExecutor使用多处理模块,这允许它绕过全局解释器锁,但也意味着只能执行和返回可拾取的对象。 
    3
    4 class concurrent.futures.ProcessPoolExecutor(max_workers=None, mp_context=None) 5 一个Executor子类,使用最多包含max_workers进程的池异步执行调用。如果max_workers没有或没有给定,它将默认为机器上的处理器数量。如果max_workers小于或等于0,则会引发ValueError。 6 7 8 #用法 9 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor 10 11 import os,time,random 12 def task(n): 13 print('%s is runing' %os.getpid()) 14 time.sleep(random.randint(1,3)) 15 return n**2 16 17 if __name__ == '__main__':
    18 19 executor=ProcessPoolExecutor(max_workers=3) 20 21 futures=[] 22 for i in range(11): 23 future=executor.submit(task,i) 24 futures.append(future) 25 executor.shutdown(True) 26 print('+++>') 27 for future in futures: 28 print(future.result()) 29 30 ProcessPoolExecutor
    #介绍
    ThreadPoolExecutor是一个Executor子类,它使用线程池异步执行调用。
    class concurrent.futures.ThreadPoolExecutor(max_workers=None, thread_name_prefix='')
    一个Executor子类,它使用最多包含max_workers线程的池异步执行调用。
    
    在3.5版中发生了更改:如果没有或没有指定max_workers,它将默认为机器上的处理器数量乘以5,假设ThreadPoolExecutor经常用于重叠I/O而不是CPU工作,并且Worker的数量应该高于ProcessPoolExecutor的工作人员数量。版本3.6中的新增功能:添加了thread_name_prefix参数,以允许用户控制线程。由池创建的工作线程的线程名称,以便于调试。
    
    #用法
    与ProcessPoolExecutor相同
    
    ThreadPoolExecutor
    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
    
    import os,time,random
    def task(n):
        print('%s is runing' %os.getpid())
        time.sleep(random.randint(1,3))
        return n**2
    
    if __name__ == '__main__':
    
        executor=ThreadPoolExecutor(max_workers=3)
    
        # for i in range(11):
        #     future=executor.submit(task,i)
    
        executor.map(task,range(1,12)) #map取代了for+submit
    
    map的用法
    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
    from multiprocessing import Pool
    import requests
    import json
    import os
    
    def get_page(url):
        print('<进程%s> get %s' %(os.getpid(),url))
        respone=requests.get(url)
        if respone.status_code == 200:
            return {'url':url,'text':respone.text}
    
    def parse_page(res):
        res=res.result()
        print('<进程%s> parse %s' %(os.getpid(),res['url']))
        parse_res='url:<%s> size:[%s]\n' %(res['url'],len(res['text']))
        with open('db.txt','a') as f:
            f.write(parse_res)
    
    
    if __name__ == '__main__':
        urls=[
            'https://www.baidu.com',
            'https://www.python.org',
            'https://www.openstack.org',
            'https://help.github.com/',
            'http://www.sina.com.cn/'
        ]
    
        # p=Pool(3)
        # for url in urls:
        #     p.apply_async(get_page,args=(url,),callback=pasrse_page)
        # p.close()
        # p.join()
    
        p=ProcessPoolExecutor(3)
        for url in urls:
            p.submit(get_page,url).add_done_callback(parse_page) #parse_page拿到的是一个future对象obj,需要用obj.result()拿到结果
    
    回调函数

    转载至:https://www.cnblogs.com/DoingBe/p/9545066.html

  • 相关阅读:
    转盘抽奖活动代码
    信息滚动条
    gulp应用学习
    js实现语音播报功能
    如何安装使用sass
    纯CSS写三角形-border法
    css兼容性写法
    字体中英文对照
    浏览器内核判断
    个人课程总结
  • 原文地址:https://www.cnblogs.com/bbjs/p/16154372.html
Copyright © 2020-2023  润新知