【10.7】ThreadPoolExecutor线程池

 1 #!/user/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 from concurrent.futures import ThreadPoolExecutor
 5 import time
 6 
 7 # 线程池
 8 # 主线程中可以获取某一个线程的状态或者某一个任务的状态,以及返回值
 9 # 当一个线程完成的时候,我们主线程能立即知道
10 # futures可以让多线程和多进程编码接口一致
11 
12 
13 def get_html(times):
14     time.sleep(times)
15     print('get page {} success'.format(times))
16     return times
17 
18 
19 executor = ThreadPoolExecutor(max_workers=1)
20 # 通过submit函数提交执行的函数到线程池中,submit是立即返回,是非阻塞的函数
21 # submit(fn, *args, **kwargs)
22 task1 = executor.submit(get_html, (3))
23 task2 = executor.submit(get_html, (2))
24 
25 # done方法用判断某个任务是否完成
26 print(task1.done())
27 # cancel不能取消任务状态为执行中或者执行完成的task
28 print(task2.cancel())
29 time.sleep(3)
30 print(task1.done())
31 
32 # result方法可以获取task的执行结果
33 print(task1.result())
False
True
get page 3 success
True
3

 

as_completed

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 from concurrent.futures import ThreadPoolExecutor, as_completed
 5 import time
 6 from collections.abc import Iterable
 7 
 8 
 9 # 线程池
10 # 主线程中可以获取某一个线程的状态或者某一个任务的状态,以及返回值
11 # 当一个线程完成的时候,我们主线程能立即知道
12 # futures可以让多线程和多进程编码接口一致
13 
14 
15 def get_html(times):
16     time.sleep(times)
17     print('get page {} success'.format(times))
18     return times
19 
20 
21 executor = ThreadPoolExecutor(max_workers=2)
22 # 通过submit函数提交执行的函数到线程池中,submit是立即返回,是非阻塞的函数
23 # submit(fn, *args, **kwargs)
24 # task1 = executor.submit(get_html, (3))
25 # task2 = executor.submit(get_html, (2))
26 
27 # 获取已经成功的task的返回
28 # 批量提交,利用列表推导式
29 urls = [3, 2, 4]
30 all_task = [executor.submit(get_html, (url)) for url in urls]
31 
32 for future in as_completed(all_task):
33     data = future.result()
34     print('get {} page'.format(data))
get page 2 success
get 2 page
get page 3 success
get 3 page
get page 4 success
get 4 page

 

map

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 from concurrent.futures import ThreadPoolExecutor, as_completed
 5 import time
 6 from collections.abc import Iterable
 7 
 8 
 9 # 线程池
10 # 主线程中可以获取某一个线程的状态或者某一个任务的状态,以及返回值
11 # 当一个线程完成的时候,我们主线程能立即知道
12 # futures可以让多线程和多进程编码接口一致
13 
14 
15 def get_html(times):
16     time.sleep(times)
17     print('get page {} success'.format(times))
18     return times
19 
20 
21 executor = ThreadPoolExecutor(max_workers=2)
22 urls = [3, 2, 4]
23 
24 # 通过executor获取已经完成的task,executor.map返回的是future.result()
25 # map的返回顺序是和urls一样的
26 for data in executor.map(get_html, urls):
27     print('get {} page'.format(data))
get page 2 success
get page 3 success
get 3 page
get 2 page
get page 4 success
get 4 page

 

wait

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 from concurrent.futures import ThreadPoolExecutor, wait
 5 import time
 6 from collections.abc import Iterable
 7 
 8 
 9 # 线程池
10 # 主线程中可以获取某一个线程的状态或者某一个任务的状态,以及返回值
11 # 当一个线程完成的时候,我们主线程能立即知道
12 # futures可以让多线程和多进程编码接口一致
13 
14 
15 def get_html(times):
16     time.sleep(times)
17     print('get page {} success'.format(times))
18     return times
19 
20 
21 executor = ThreadPoolExecutor(max_workers=2)
22 # 通过submit函数提交执行的函数到线程池中,submit是立即返回,是非阻塞的函数
23 # submit(fn, *args, **kwargs)
24 # task1 = executor.submit(get_html, (3))
25 # task2 = executor.submit(get_html, (2))
26 
27 # 获取已经成功的task的返回
28 # 批量提交,利用列表推导式
29 urls = [3, 2, 4]
30 all_task = [executor.submit(get_html, (url)) for url in urls]
31 
32 # 等待某一或一组任务的完成,阻塞主线程
33 wait(all_task)
34 print('ok')
get page 2 success
get page 3 success
get page 4 success
ok

 

posted @ 2019-08-05 19:37  _simpleSmile  阅读(198)  评论(0编辑  收藏  举报