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))