多处理:比cpu.count更多的进程

时间:2015-03-17 00:21:38

标签: python multiprocessing

注意:我在2天前“{forayed”进入了multiprocessing的土地。所以我的理解非常基础。

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

修改

我借用了here的代码。我只是略微改变了它,我要求用户选择核心用法,而不是将parallel_processes设置为4

1 个答案:

答案 0 :(得分:15)

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

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