我有一个简单的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个小时内终止,而不是在两倍的时间内终止,因为我有更多的进程然后核心。 : - )
答案 0 :(得分:4)
顺便说一句,如果您创建一个没有参数的池,if将使用cpu_count()
的结果自动推断出可用内核的数量。
在任何现代多任务操作系统中,没有任何一个程序通常能够保持核心占用而不允许其他程序在其上运行。
您应该启动多少工作人员取决于start_process
功能的特征。核心数量不是唯一的考虑因素。
如果每个工作进程使用例如1/4的可用内存,从3开始将导致大量的交换和一般的减速。这种情况称为“内存限制”。
如果工作进程执行的不仅仅是计算(例如读取或写入磁盘),则必须等待很多(因为磁盘比RAM慢很多;这称为“IO绑定”)。在这种情况下,每个核心启动多个工作人员可能是值得的。
如果工作者不受内存限制或IO限制,则它们将受到核心数量的限制。
答案 1 :(得分:1)
操作系统将控制将哪些进程分配给哪个核心,因为运行的其他应用程序进程无法保证您的应用程序可以使用所有8个核心。
主线程将保留自己的进程,但由于map()函数被阻止,因此该进程也可能被阻塞,而不是使用任何CPU核心。