ThreadPoolExecutor _future

 1 from concurrent.futures import ThreadPoolExecutor as Pool
 2 from concurrent.futures import as_completed
 3 import requests
 4 
 5 URLS = ['http://qq.com', 'http://sina.com', 'http://www.baidu.com', ]
 6 
 7 
 8 def task(url, timeout=10):
 9     return requests.get(url, timeout=timeout)
10 
11 
12 # 生成3个线程实例
13 with Pool(max_workers=3) as executor:
14     '''
15      Future可以理解为一个在未来完成的操作,这是异步编程的基础。
16      通常情况下,我们执行io操作,访问url时(如下)在等待结果返回之前会产生阻塞,
17      cpu不能做其他事情,而Future的引入帮助我们在等待的这段时间可以完成其他的操作
18      Future实例是由Executor.submit()创建的。Future提供了丰富的方法来处理调用。
19     '''
20     future_tasks = [executor.submit(task, url) for url in URLS]
21     # 判断是否在正在运行
22     for f in future_tasks:
23         if f.running():
24             print('%s is running' % str(f))
25     # 执行完成返回一个迭代器
26     for f in as_completed(future_tasks):
27         try:
28             # 执行完成后返回状态
29             ret = f.done()
30             if ret:
31                 f_ret = f.result()
32                 print('%s,done,retult:%s, %s' % (str(f), f_ret.url, len(f_ret.content)))
33         except Exception as e:
34             f.cancel()
35             print(str(e))

 

posted on 2018-08-20 14:13  jovelove  阅读(287)  评论(0)    收藏  举报