繁体   English   中英

了解多处理模块的cpu核心的使用

[英]Understanding the usage of cpu cores of the multiprocessing module

我有一个简单的main()函数来处理大量数据。 由于我有一台带有大量内存的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.

我知道启动这个脚本是一个自己的过程,即在所有子过程完成后完成的主过程。 显然,Main进程不会占用太多资源,因为它只会首先准备数据并生成子进程。 它也将自己使用核心吗? 意义只能启动7个子进程而不是我喜欢从上面开始的8个子进程?

核心问题是:我可以生成8个子进程并确保它们能够正常并行运行吗?

顺便说一下,子进程不以任何方式相互交互,当它们完成时,它们每个都生成一个sqlite数据库文件,用于存储结果。 所以即使是result_storage也是单独处理的。

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

cpu_count() ,如果您创建一个没有参数的池,if将使用cpu_count()的结果自动推断出可用内核的数量。

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

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

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

如果工作进程执行的不仅仅是计算(例如读取或写入磁盘),则必须等待很多(因为磁盘比RAM慢很多;这称为“IO绑定”)。 在这种情况下,每个核心启动多个工作人员可能是值得的。

如果工作者不受内存限制或IO限制,则它们将受核心数量的限制。

操作系统将控制将哪些进程分配给哪个核心,因为有其他运行的应用程序进程无法保证您的应用程序可以使用所有8个核心。

主线程将保留自己的进程,但由于map()函数被阻止,进程很可能也被阻塞,而不是使用任何CPU核心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM