Python 并行流水线编程

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

我有一个linux虚拟机,每4小时更新一次新的数据文件。 这些文件按编号为01到10的目录组织

我有一个可执行文件(convert.exe),可以将上传的文件转换为不同的文件类型

我想开发一个管道来处理文件(convert.exe),然后将它们重定向到另一个目录

我已经用LinuxBash脚本编写了这个系列。 使用以下代码:

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