我有一个python代码处理很多apache日志(解压,解析,处理数字,regexping等)。一个父进程接受文件列表(最多几百万),并使用多进程池将文件列表发送给工作进程进行解析。
我想知道,是否有任何指南/基准/建议可以帮助我估计子进程的理想数量?每个核心一个进程比启动几百个进程更好吗?
目前脚本执行的3/4时间是读取文件并解压缩它们,在资源方面,它的CPU是100%加载,内存和I/O是ok的。所以我认为有很多事情可以通过适当的多处理设置来完成。脚本将在不同的机器/操作系统上运行,因此也欢迎特定于操作系统的提示。
另外,使用线程而不是多进程有什么好处吗?
号我想知道,如果有任何指南/基准/建议,可以帮助我估计子进程的理想数量?
每个核心一个进程比启动几百个进程更好吗?
你不可能事先知道。
自由度太多了。
你只能通过实验来发现它,直到你得到你想要的性能水平。
另外,使用线程而不是多进程有什么好处吗?
很少。
线程没有多大帮助。当进程(作为一个整体)等待O/S完成I/O请求时,执行I/O的多个线程将被锁定等待。
您的操作系统在调度进程方面做得非常非常好。当你有I/O密集型操作时,你真的需要多个进程。
如果程序受I/O限制,多核不会提供更好的性能。如果磁盘服务两个或更多主服务器,性能甚至可能变得更差。
我不确定当前的操作系统是否这样做,但过去I/O缓冲区是按进程分配的,因此将一个进程的缓冲区分配给多个线程会导致缓冲区抖动。您最好使用多个进程来处理I/o繁重的任务。
我先回答最后一个问题。在CPython中,通过跨线程分配cpu负载来获得相当大的性能提升几乎是不可能的。这是由于全局解释器锁。在这方面,multiprocessing
是更好的选择。
至于估计理想的工作人员数量,我的建议是:用你的代码、数据、硬件和不同数量的工作人员进行一些实验,看看你能从加速、瓶颈等方面收集到什么。