ThreadPoolExecutor
和 concurrent.futures
中的线程池与 multiprocessing.dummy
中的 ThreadPool
有什么区别吗?这篇文章表明,ThreadPool
将 "线程"(任务)查询到 CPU 的不同 "线程"。那么 concurrent.futures
是否也是如此,还是 "线程"(任务)将查询到单个 CPU 的 "线程"?ThreadPoolExecutor
和 concurrent.futures
中的线程池与 multiprocessing.dummy
中的 ThreadPool
有什么区别吗?这篇文章表明,ThreadPool
将 "线程"(任务)查询到 CPU 的不同 "线程"。那么 concurrent.futures
是否也是如此,还是 "线程"(任务)将查询到单个 CPU 的 "线程"?multiprocessing.dummy.ThreadPool
是multiprocessing.Pool
API的一个副本,它使用线程而不是进程,这导致了一些奇怪的问题,因为线程和进程非常不同,包括返回只有它自己能理解的AsyncResult
类型。
concurrent.futures.ThreadPoolExecutor
是concurrent.futures.Executor
的子类,它是一个更新、更简单的API,考虑到了进程和线程,并返回一个通用的concurrent.futures.Future
。concurrent.futures.ThreadPoolExecutor
做得更好。
参考资料:
multiprocessing.dummy
复制了multiprocessing的API,但实际上只是对threading模块的一个包装。特别地,由Pool函数返回一个
ThreadPool
实例,它是Pool
的子类,支持所有相同的方法调用,但使用的是一组工作线程而不是工作进程。
来自multiprocessing.dummy.ThreadPool
文档
ThreadPool
和Pool
共享相同的接口,它是围绕进程池设计的,并且在concurrent.futures
模块引入之前就存在了。因此,它继承了一些对于由线程支持的池来说没有意义的操作,并且它有自己的类型来表示异步作业的状态,即AsyncResult
,这个类型其他库不理解。用户通常应该优先使用
concurrent.futures.ThreadPoolExecutor
,它具有更简单的接口,从一开始就是围绕线程设计的,并且返回与许多其他库兼容的concurrent.futures.Future
实例,包括asyncio
。