多处理:超过 cpu.count 的进程

Multiprocessing : More processes than cpu.count

: 我"forayed" 2 天前进入了multiprocessing 的土地。所以我的理解很基础。

我正在撰写和申请上传到 amazon s3 个存储桶。如果文件大小较大 (100mb),我已经使用 multiprocessing 模块中的 pool 实现了并行上传。我正在使用 core i7 的机器,我有 8cpu_count。我的印象是,如果我 pool = Pool(process = 6) 我使用 6 核心,文件开始分部分上传,前 6 部分的上传同时开始。要查看 process 大于 cpu_count 时会发生什么,我输入了 20(暗示我想使用 20 个内核)。令我惊讶的是,程序并没有出现错误,而是开始同时上传 20 个部分(我使用了一个较小的 chunk size 来确保有足够的部分)。 我不明白这种行为。我只有 8 个内核,所以他的程序怎么不能接受 20 个输入?当我说 process=6 时,它实际上使用 6 个线程吗??这可能是 20 是有效输入的唯一解释,因为可以有 1000 个线程。谁能给我解释一下。

编辑:

我 'borrowed' 来自 here 的代码。我只是稍微改变了它,我要求用户提供他选择的核心用法,而不是将 parallel_processes 设置为 4

您计算机上并发的进程数运行不受内核数的限制。事实上,您的计算机上现在可能有数百个程序 运行 - 每个程序都有自己的进程。为了使其正常工作,OS 仅临时将 8 个处理器中的一个分配给每个进程或线程 - 在某些时候它可能会停止,另一个进程将取代它。如果您想了解更多信息,请参阅 What is the difference between concurrent programming and parallel programming?

编辑:在上传示例中分配更多进程可能有意义也可能没有意义。从磁盘读取和通过网络发送通常是 python 中的阻塞操作。可以暂停等待其数据块被读取或发送的进程,以便另一个进程可以启动其 IO。另一方面,如果进程过多,文件 I/O 或网络 I/O 将成为瓶颈,并且由于进程切换所需的额外开销,您的程序将变慢。