gpt4 book ai didi

python - 了解 multiprocessing 模块的 cpu 核心的使用

转载 作者:太空狗 更新时间:2023-10-30 02:49:09 25 4
gpt4 key购买 nike

我有一个处理大量数据的简单 main() 函数。由于我有一台带有大量 ram 的 8 核机器,因此建议我使用 python 的 multiprocessing 模块来加速处理。每个子流程大约需要 18 个小时才能完成。

长话短说,我怀疑我是否正确理解了 multiprocessing 模块的行为。

我以某种方式启动了不同的子流程:

def main():
data = huge_amount_of_data().
pool = multiprocessing.Pool(processes=cpu_cores) # cpu_cores is set to 8, since my cpu has 8 cores.
pool.map(start_process, data_chunk) # data_chunk is a subset data.

我理解启动这个脚本是它自己的一个进程,即所有子进程完成后主进程结束。显然主进程不会消耗太多资源,因为它只会首先准备数据并生成子进程。 它自己也会使用核心吗?意思是只能启动 7 个子进程,而不是上面我喜欢启动的 8 个?

核心问题是:我能否生成 8 个子进程并确保它们能够正确并行地工作?

顺便说一句,子进程之间不会以任何方式交互,当它们完成时,它们各自生成一个 sqlite 数据库文件,用于存储结果。因此,即使是 result_storage 也是单独处理的。

我想避免的是,我生成一个会阻碍其他进程全速运行的进程。我需要代码在大约 16 小时内终止,而不是两倍的时间,因为我有比核心更多的进程。 :-)

最佳答案

顺便说一句,如果您创建一个不带参数的池,if 将使用 cpu_count() 的结果自动推断出可用内核的数量。

在任何现代多任务操作系统上,通常没有任何一个程序能够保持一个核心被占用并且不允许其他程序在其上运行。

您应该启动多少个 worker 取决于您的 start_process 函数的特性。核心数量并不是唯一的考虑因素。

如果每个工作进程使用例如可用内存的 1/4,开始超过 3 将导致大量交换和一般速度减慢。这种情况称为“内存限制”。

如果工作进程做的不仅仅是计算(例如从磁盘读取或写入磁盘),它们将不得不等待很长时间(因为磁盘比 RAM 慢很多;这称为“IO 限制”)。在这种情况下,每个核心启动一个以上的工作线程可能是值得的。

如果 worker 不受内存限制或 IO 限制,它们将受内核数量的限制。

关于python - 了解 multiprocessing 模块的 cpu 核心的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9455645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com