Jon*_*des 5 python bash multithreading xargs
我们有一个包含50个数据文件(下一代DNA序列)的文件夹,需要通过在每个文件上运行python脚本进行转换.该脚本每个文件需要5个小时,它是单线程的,并且主要受CPU限制(CPU核心运行率为99%,磁盘IO最小).
由于我有一台4核机器,我想一次运行这个脚本的4个实例,以大大加快这个过程.
我想我可以将数据拆分为4个文件夹,同时在每个文件夹上运行以下bash脚本:
files=`ls -1 *`
for $file in $files;
do
out = $file+=".out"
python fastq_groom.py $file $out
done
Run Code Online (Sandbox Code Playgroud)
但必须有更好的方法在一个文件夹上运行它.我们可以使用Bash/Python/Perl/Windows来执行此操作.
(遗憾的是,使脚本多线程超出了我们的能力范围)
使用@phs xargs解决方案是我们解决问题的最简单方法.然而,我们要求原始开发人员实现@Björn的回答.再次感谢!
您可以使用multiprocessing-module.我想你有一个要处理的文件列表和一个为每个文件调用的函数.然后你可以简单地使用这样的工作池:
from multiprocessing import Pool, cpu_count
pool = Pool(processes=cpu_count)
pool.map(process_function, file_list, chunksize=1)
Run Code Online (Sandbox Code Playgroud)
如果您process_function没有返回值,则可以忽略返回值.
看一眼xargs。它的-P选项提供了可配置的并行度。具体来说,这样的东西应该适合你:
ls files* | awk '{print $1,$1".out"}' | xargs -P 4 -n 2 python fastq_groom.py
Run Code Online (Sandbox Code Playgroud)