Python 并行流水线编程
我有一个linux虚拟机,每4小时更新一次新的数据文件。 这些文件按编号为01到10的目录组织 我有一个可执行文件(convert.exe),可以将上传的文件转换为不同的文件类型 我想开发一个管道来处理文件(convert.exe),然后将它们重定向到另一个目录 我已经用LinuxBash脚本编写了这个系列。 使用以下代码:Python 并行流水线编程,python,linux,snakemake,Python,Linux,Snakemake,我有一个linux虚拟机,每4小时更新一次新的数据文件。 这些文件按编号为01到10的目录组织 我有一个可执行文件(convert.exe),可以将上传的文件转换为不同的文件类型 我想开发一个管道来处理文件(convert.exe),然后将它们重定向到另一个目录 我已经用LinuxBash脚本编写了这个系列。 使用以下代码: for d in $(find /mnt/data01/dpad -mindepth 1 -name "DIR*" -type d); do #recursively
for d in $(find /mnt/data01/dpad -mindepth 1 -name "DIR*" -type d); do
#recursively iterate through files
#for those that were modified within the last day (i.e. new files added)
for f in $(find $d -type f -mtime -1); do
#determine appropriate folder for file to move to
newdirname=$(basename $d)
newfilename=$(basename $f)
mono convert.exe $f -o /mnt/convertedfiles/$newdirname/$newfilename
done
done
然而,我想使用我拥有的处理能力,并在多个CPU上并行运行,以获得更多的实时转换方法和结果
我计划改用python并使用snakemake分发命令
我对编程并不陌生,但对python
和snakemake
命令却很陌生
只是想知道是否有人能提供一些关于如何开始这个过程的见解?您可能需要使用
操作系统
,线程
或多处理
,以及子过程
模块
您需要做的第一件事是获取要处理的文件列表。您可以使用os
库进行此操作os.listdir
将为您提供目录的内容os.walk
将递归地迭代目录的内容(和子目录)
import os
import subprocess
import multiprocessing
filepaths = []
for root, dirnames, filenames in os.walk('/root/path'):
for filename in filenames:
if filename.endswith('.jpg'):
filepaths.append(os.path.join(root, filename))
现在您已经有了要处理的文件名列表,您需要一个可以并行运行的函数。您还需要构造所有不同的参数集以传递给该函数(在本例中为输出文件名)
现在我们可以创建一组进程,每个进程处理一组不同的数据
def func(data)
p = subprocess.Popen(['mono', 'convert.exe', data['src'], '-o', data['dst'])
p.wait()
# Using 4 worker processes. If you don't specify a number, it defaults
# to the number of cpu cores you have.
pool = multiprocessing.Pool(4)
pool.map(func, arguments)
GNU并行可能是一个简单的解决方案,但不是Python。
def func(data)
p = subprocess.Popen(['mono', 'convert.exe', data['src'], '-o', data['dst'])
p.wait()
# Using 4 worker processes. If you don't specify a number, it defaults
# to the number of cpu cores you have.
pool = multiprocessing.Pool(4)
pool.map(func, arguments)
doit() {
d="$1"
for f in $(find $d -type f -mtime -1); do
#determine appropriate folder for file to move to
newdirname=$(basename $d)
newfilename=$(basename $f)
mono convert.exe $f -o /mnt/convertedfiles/$newdirname/$newfilename
done
}
export -f doit
find /mnt/data01/dpad -mindepth 1 -name "DIR*" -type d | parallel doit