concurrent.futures 使用及解析
from concurrent.futures import ThreadPoolExecutor, as_completed, wait, FIRST_COMPLETED from concurrent.futures import Future from multiprocessing import Pool #未来对象,task的返回容器 #线程池, 为什么要线程池 #主线程中可以获取某一个线程的状态或者某一个任务的状态,以及返回值 #当一个线程完成的时候我们主线程能立即知道 #futures可以让多线程和多进程编码接口一致 import time def get_html(times): time.sleep(times) print("get page {} success".format(times)) return times executor = ThreadPoolExecutor(max_workers=2) #通过submit函数提交执行的函数到线程池中, submit 是立即返回 # task1 = executor.submit(get_html, (3)) # task2 = executor.submit(get_html, (2)) #要获取已经成功的task的返回 urls = [3,2,4] all_task = [executor.submit(get_html, (url)) for url in urls] wait(all_task, return_when=FIRST_COMPLETED) print("main") # for future in as_completed(all_task): #谁先完成,谁先打印 # data = future.result() # print("get {} page".format(data)) #通过executor的map获取已经完成的task的值,顺序 # for data in executor.map(get_html, urls): # print("get {} page".format(data)) # #done方法用于判定某个任务是否完成 # print(task1.done()) # print(task2.cancel()) # time.sleep(3) # print(task1.done()) # # #result方法可以获取task的执行结果 # print(task1.result())
多进程
import time from concurrent.futures import ThreadPoolExecutor, as_completed from concurrent.futures import ProcessPoolExecutor #多进程编程 #耗cpu的操作,用多进程编程, 对于io操作来说, 使用多线程编程,进程切换代价要高于线程 #1. 对于耗费cpu的操作,多进程由于多线程 # def fib(n): # if n<=2: # return 1 # return fib(n-1)+fib(n-2) # # if __name__ == "__main__": # with ThreadPoolExecutor(3) as executor: # all_task = [executor.submit(fib, (num)) for num in range(25,40)] # start_time = time.time() # for future in as_completed(all_task): # data = future.result() # print("exe result: {}".format(data)) # # print("last time is: {}".format(time.time()-start_time)) #2. 对于io操作来说,多线程优于多进程 def random_sleep(n): time.sleep(n) return n if __name__ == "__main__": with ProcessPoolExecutor(3) as executor: all_task = [executor.submit(random_sleep, (num)) for num in [2]*30] start_time = time.time() for future in as_completed(all_task): data = future.result() print("exe result: {}".format(data)) print("last time is: {}".format(time.time()-start_time))