Jin*_*Jin 0 python multithreading
我有一个大文件作为我的python代码的输入,它将生成相应的输出文件.但是,它需要太多时间,我想加快速度.
现在,我将大文件拆分为1000个较小的文件.我想有一个小脚本,将启动1000个线程,每个线程使用我原来的python代码,并有自己的输出文件.
谁能给我一个示例/示例代码?
首先,使用1000个线程几乎肯定会减慢速度,而不是加快速度.即使您的代码完全受I/O限制,1000正在推动许多平台调度程序的限制,并且您将花费更多时间进行上下文切换而不是实际工作.
接下来,您需要知道您的代码是否受CPU限制(即,对内存中的信息进行实际处理)或I/O绑定(即等待磁盘读取和写入等操作).
如果您的代码受CPU限制,并且您可以保持CPU非常一致,那么您希望每个核心只有1个线程.这样,假设大多数工作都是在不可变或非共享值上完成的,那么您将获得最大量的并行度和最小量的上下文切换(以及缓存抖动).
此外(除非该工作是在专门设计的C扩展中完成的,比如numpy),您希望这些线程位于不同的进程中,因为每个进程只有一个线程可以一次运行Python解释器,这要归功于Global Interpreter Lock.
所以,你想要的几乎肯定是一个流程池.最简单的方法是使用concurrent.futures.ProcessPoolExecutor,可能带有一个max_workers参数(可能从16开始,然后尝试上下调整它以查看它是否有帮助).
另一方面,如果你的代码主要受I/O限制,那么几十个线程是合理的,特别是如果延迟是不可预测的,而不是1000.并且同一进程中的线程将正常工作,因为一个线程可以运行Python解释器,而其他人都在等待操作系统完成磁盘操作.
所以,在这种情况下,你想要一个concurrent.futures.ThreadPoolExecutor.
如果您不确定,并且不知道如何查找,请首先使用线程池构建它,然后使用ActivityMonitor或者现在调用其进程管理器或您在Linux上300个选项中最喜欢的任何Windows来观察它运行; 如果你最终得到一个100%的核心而其他核心低于25%,那么你太过CPU了,不能使用线程.幸运的是,切换到进程池是一个微不足道的变化,替换ThreadPoolExecutor用ProcessPoolExecutor,并删除max_workers参数,因此Python会挑最好的默认,现在你就大功告成了.
在任何一种情况下,文档中的示例都足够好,没有理由要求其他示例代码.