码迷,mamicode.com
首页 > 编程语言 > 详细

Python Day37 python多线程标准模块concurrent.futures

时间:2017-10-16 15:00:10      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:down   pytho   ==   rand   github   turn   parse   als   status   

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)

~~回调函数
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()拿到结果

回调函数

 





~~~map方法的使用
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的用法

 

 




Python Day37 python多线程标准模块concurrent.futures

标签:down   pytho   ==   rand   github   turn   parse   als   status   

原文地址:http://www.cnblogs.com/liuduo/p/7676770.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!