定义适当数量的流程

时间:2011-07-21 10:21:55

标签: python multithreading performance benchmarking

我有一个python代码处理很多apache日志(解压缩,解析,处理数字,正则表达等)。一个父进程,它使用多进程池获取文件列表(最多几百万),并发送一个文件列表以解析为工作者。

我想知道,是否有任何指导方针/基准/建议可以帮助我估计理想的儿童过程数量?即。每个核心有一个进程比发布几百个进程好吗?

目前3/4时间的脚本执行正在读取文件并对其进行解压缩,而在资源方面,其CPU加载100%,内存和I / O正常。所以我假设有很多可以通过适当的多处理设置来完成。脚本将在不同的机器/操作系统上运行,因此也欢迎特定于操作系统的提示。

此外,使用线程而不是多进程有什么好处吗?

4 个答案:

答案 0 :(得分:1)

  

我想知道,是否有任何指导方针/基准/建议可以帮助我估算理想的儿童过程数量?

没有

  每个核心有一个进程比启动几百个进程好吗?

您永远无法事先知道

有太多的自由度。

你只能通过运行实验来发现它,直到你达到你想要的表现水平。

  

此外,使用线程而不是多进程有什么好处吗?

很少。

线程没有多大帮助。执行I / O的多个线程将被锁定等待,同时进程(作为一个整体)等待O / S完成I / O请求。

您的操作系统在调度过程方面做得非常好。当您进行I / O密集型操作时,您确实需要多个进程。

答案 1 :(得分:1)

如果程序受I / O限制,则多个内核不能提供更好的性能。如果磁盘服务于两个或更多主服务器,性能甚至可能会变差。

答案 2 :(得分:0)

我先解决最后一个问题。在CPython中,通过跨线程分配CPU绑定负载几乎不可能获得可观的性能提升。这是由Global Interpreter Lock引起的。在这方面,multiprocessing是一个更好的选择。

至于估计理想的工人数量,我的建议是:对您的代码,数据,硬件和不同数量的工作人员进行一些实验,看看您可以从加速,瓶颈方面收集到的内容等

答案 3 :(得分:0)

我不确定当前的操作系统是否这样做,但过去曾经是每个进程分配了I / O缓冲区,因此在多个线程之间划分一个进程的缓冲区会导致缓冲区抖动。对于I / O繁重的任务,使用多个进程会好得多。