concurrent.futures模块之基本介绍

276 阅读1分钟

python标准库为我们提供了threading模块和multiprocessing模块编写相应的多进程/多线程代码。此外,python标准库的concurrent.futures模块还提供了ThreadPoolExcutor和ProcessPoolExcutor,用于编写线程池/进程池

Future可以把它当做是一个在将来要完成的动作。一般而言,执行io操作访问url时在等待结果返回前会产生阻塞,CPU不能做其他事情,只能傻等。因此引入Future就是为了帮助我们在CPU傻等的这段时间内完成一些其他的事情。此外, Future类封装了可调用的异步执行。

1.简单实例

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time
​
​
# 线程的执行方法
def print_value(value):
    print("Thread__" + str(value))
​
​
# 每个进程里面的线程
def my_thread(value):
    # 这里的max_workers是线程池里面的线程数
    thread = ThreadPoolExecutor(max_workers=2)
    thread.submit(print_value, value)
    thread.submit(print_value, value)
​
​
# 创建两个进程, 每个进程执行my_thread方法,my_thread是在每个进程里面开启线程再执行。
def my_process():
    # 这里的max_workers是进程池里面的进程数
    pool = ProcessPoolExecutor(max_workers=2)
    pool.submit(my_thread, time.time())
    pool.submit(my_thread, time.time())
​
​
if __name__ == '__main__':
    my_process()

result:

Thread__1630849003.8332403
Thread__1630849003.8332403
Thread__1630849003.8628194
Thread__1630849003.8628194

2.获取任务的执行结果

concurrent.futures模块已经为我们简化了多线程和多进程的使用,由于多线程和多进程在执行过程中所消耗的时间各不相同,为了获得所有线程或进程的执行结果,可以使用as_completed()方法获取

from concurrent import futures
import time
import random
​
​
def task(n):
    time.sleep(random.random())
    return n, n / 10
​
​
thread = futures.ThreadPoolExecutor(max_workers=2)
print('程序开始......')
task_list = [thread.submit(task, i) for i in range(5, 0, -1)]
for f in futures.as_completed(task_list):
    print(f'result:{f.result()}')

result:

程序开始......
result:(5, 0.5)
result:(4, 0.4)
result:(2, 0.2)
result:(1, 0.1)
result:(3, 0.3)