使用Python';处理数据文件的并行编程工具

使用Python';处理数据文件的并行编程工具,python,multithreading,parallel-processing,Python,Multithreading,Parallel Processing,我正在尝试使用python通过一个并行程序运行一个文件列表 为了抽象出我这样做的真正原因,我编写了一个名为fake_program.py的小型命令行程序,它接受一个文本文件作为参数,其中包含由逗号分隔的任意数字列表。程序将数字相加并打印结果 伪程序.py: import argparse ##parse arguments from command line parser = argparse.ArgumentParser() parser.add_argument('filename', t

我正在尝试使用python通过一个并行程序运行一个文件列表

为了抽象出我这样做的真正原因,我编写了一个名为
fake_program.py
的小型命令行程序,它接受一个文本文件作为参数,其中包含由逗号分隔的任意数字列表。程序将数字相加并打印结果

伪程序.py

import argparse
##parse arguments from command line 
parser = argparse.ArgumentParser()
parser.add_argument('filename', type=str)
args = parser.parse_args()

## read data file
with open(args.filename) as f:
    numbers = f.read()

## process and add the numbers 
numbers = numbers.split(',')
numbers = [int(i) for i in numbers]
print reduce(lambda x, y: x + y, numbers)
输入文件示例:

数据文件\u 1.txt
包含:

1, 2, 3
数据文件2.txt
包含

4, 5, 6
7, 8, 9
数据\u file3.txt
包含

4, 5, 6
7, 8, 9
使用方法:

$ python fake_program.py data_file1.txt
输出

6
我的目标是通过
fake_program.py
并行处理这三个文件(或任意数量的类似文件)。请注意,对于这个简单的示例,只需运行
fake_program.py
的单独实例即可处理所有数据。然而,我真正运行的程序计算量很大,大约有8个实例没有响应。由于我在程序中运行了大约400个数据文件,每个文件最多需要5分钟来处理,因此最好引入一个
队列
,这样(比如)可以一次处理5个数据文件,当一个文件完成后,另一个文件开始处理

以下是迄今为止的脚本:

from subprocess import Popen, PIPE
from threading import Thread
import Queue
from multiprocessing import cpu_count
import glob

def run1(q, fle):
    """
    Process 1 file 
    :return: 
    """
    args = ['python', 'fake_program.py', '"{}"'.format(fle)]
    proc = Popen(args, stdin=PIPE, stdout=PIPE,
                 stderr=PIPE, shell=False)

    q.put(proc, block=True)



def run_all(files):
    """

    """
    number_of_processes = cpu_count()
    q = Queue.Queue(number_of_processes)
    result = []
    for fle in files:
        t = Thread(target=run1, args=(q, fle))
        t.start()
        q.join()
        result.append(q.get())
    return result   

if __name__=='__main__':
    working_directory = </my/working/directory>
    data_files = glob.glob(working_directory+'\*.txt')
    print data_files
    print run_all(data_files)
从子流程导入Popen,管道
从线程导入线程
导入队列
从多处理导入cpu\u计数
导入glob
def运行1(q,fle):
"""
进程1文件
:返回:
"""
args=['python'、'fake_program.py'、'{}'.format(fle)]
proc=Popen(args,stdin=PIPE,stdout=PIPE,
stderr=管道,shell=假)
q、 put(proc,block=True)
def run_all(文件):
"""
"""
进程数=cpu计数()
q=队列。队列(进程的数量)
结果=[]
对于文件中的fle:
t=线程(目标=run1,args=(q,fle))
t、 开始()
q、 加入
result.append(q.get())
返回结果
如果“名称”=“\uuuuuuuu主要”:
工作目录=
data\u files=glob.glob(工作目录+'\*.txt')
打印数据文件
打印所有运行(数据文件)

这个程序目前只是无限挂起。有人对我如何实现这种并行性有什么建议吗

可能使用多处理池而不是队列。如果您的作业是异步的,那么它的使用非常简单。此外,如果您的子进程抛出异常,Python多处理可能不够智能,无法将其返回到主进程。我以前在这种情况下见过挂起。

最简单的方法是分割数据并运行三个程序实例,这可以通过一个简短的shell脚本轻松地协调。是的,但这是我正在处理的另一个问题的抽象-
fake_程序
实际上是一个执行繁重任务的
c++
命令行程序。因此,我必须以这种方式运行程序。谢谢你的回答。也许你应该描述你的实际问题,而不是“C++中另一个问题的抽象”?想必您想要的是解决方案,而不是解决方案的抽象。。。。我有。我试着用Python做这个,而不是C++。刚才我使用的第三方程序是C++,即<代码> FaKy.Studio。Py < /C> >实际上是一个可执行的(抱歉误导),但这不能解释为什么不能只启动三个程序实例。使用python合并结果,如果必须,使用shell来编排流程。它很擅长。