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
原文:https://www.cnblogs.com/zydeboke/p/11305094.html