第十章:使用进程、线程和协程提供并发性-concurrent.futures:管理并发任务池-利用基本线程池使用map()

10.6 concurrent.futures:管理并发任务池
concurrent.futures模块提供了使用工作线程或进程池运行任务的接口。线程和进程池的API是一样的,所以应用只做最小的修改就可以在线程和进程之间顺利地切换。这个模块提供了两种类型的类与这些池交互。执行器(executor)用来管理工作线程或进程池,future用来管理工作线程或进程计算的结果。要使用一个工作线程或进程池,应用要创建适当的执行器类的一个实例,然后向它提交任务来运行。每个任务启动时,会返回
一个Future实例。需要任务的结果时,应用可以使用Future阻塞,直到得到结果。目前已经提供了不同的API,可以很方便地等待任务完成,所以不需要直接管理Future对象。

10.6.1 利用基本线程池使用map()
ThreadPoolExecutor管理一组工作线程,当这些线程可以用于完成更多工作时,可以向它们传入任务。下面的例子使用map()并发地从一个输入迭代器生成一组结果。这个任务使用time.sleep()暂停不同的时间,从而展示不论任务的执行顺序如何,map()总是根据输入按顺序返回值。

from concurrent import futures
import threading
import time


def task(n):
    print('{}: sleeping {}'.format(
        threading.current_thread().name,
        n)
          )
    time.sleep(n / 10)
    print('{}:done with {}'.format(
        threading.current_thread().name,
        n)
          )
    return n / 10


ex = futures.ThreadPoolExecutor(max_workers=2)
print('main:starting')
results = ex.map(task,range(5,0,-1))
print('main:unprocessed results {}'.format(results))
print('main:waiting for real results')
real_results = list(results)
print('main:results: {}'.format(real_results))

map()的返回值实际上是一种特殊类型的迭代器,它知道主程序迭代处理时要等待各个响应。
运行结果:
第十章:使用进程、线程和协程提供并发性-concurrent.futures:管理并发任务池-利用基本线程池使用map()_第1张图片

你可能感兴趣的:(Python标准库)