我有一个python代码处理很多apache日志(解压缩,解析,处理数字,正则表达等)。一个父进程,它使用多进程池获取文件列表(最多几百万),并发送一个文件列表以解析为工作者。
我想知道,是否有任何指导方针/基准/建议可以帮助我估计理想的儿童过程数量?即。每个核心有一个进程比发布几百个进程好吗?
目前3/4时间的脚本执行正在读取文件并对其进行解压缩,而在资源方面,其CPU加载100%,内存和I / O正常。所以我假设有很多可以通过适当的多处理设置来完成。脚本将在不同的机器/操作系统上运行,因此也欢迎特定于操作系统的提示。
此外,使用线程而不是多进程有什么好处吗?
答案 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繁重的任务,使用多个进程会好得多。