【发布时间】:2021-09-03 11:45:39
【问题描述】:
以下是创建进程池的 Python 代码,为每个文件分配一个进程,最多可使用 CPU 数量。
我想把它翻译成 C++(但我们使用线程,而不是进程)。
但是,据我所知,std::async 不允许限制 CPU 的数量。
std::async 怎么知道不让系统过载?在 2 核 CPU 上生成 20 个线程是没有意义的。
我真的希望避免为必须非常常见的东西编写自己的线程池。
实现这一目标的最简单方法是什么?
pool = multiprocessing.Pool(processes=max_cpus)
for file in file_list:
pool.apply_async(my_func, args=(file,),)
pool.close()
pool.join()
【问题讨论】:
-
std::async 不知道您需要一个线程池。然而,产生与 cpu 一样多的线程并不意味着您将拥有所有的 cpu。稍后我会发布一个演示线程池。
-
std::async不会(必然)盲目地创建与您排队的任务一样多的线程。在实践中,标准库实现者将拥有一个线程池,但该线程池的大小显然是一个可能基于硬件规范和/或启发式的实现细节。 -
@CoryKramer 我知道这适用于 Windows/MSVC(它使用线程池),但不一定适用于其他系统/编译器,并且每次调用只会使用新的 std::thread
-
你可以使用
std::thread::hardware_concurrency()来查找CPU的数量。
标签: c++