如何从Python中的多处理中检索输出?

时间:2016-03-11 15:19:39

标签: python

所以,我试图通过在Python中使用Multiprocessing模块来加速一个例程。我希望能够通过将作业分成几个核心来读取几个.csv文件,因为我有:

def csvreader(string):

  from numpy import genfromtxt;

  time,signal=np.genfromtxt(string, delimiter=',',unpack="true") 
  return time,signal

然后我通过说:

来调用此函数
if __name__ == '__main__':
     for i in range(0,2):
        p = multiprocessing.Process(target=CSVReader.csvreader, args=(string_array[i],))
        p.start()

问题是这不存储任何输出。我已经在线阅读了所有的论坛,并看到有一种方法可以使用multiprocessing.queue,但我不太了解它。 有没有简单明了的方法?

2 个答案:

答案 0 :(得分:3)

您最好的选择是multiprocessing.Queuemultiprocessing.Pipe,它们是专为此问题而设计的。它们允许您以安全和简单的方式在进程之间发送数据。

如果您想返回csvreader函数的输出,则应该向其传递另一个参数,即multiprocessing.Queue,通过该参数将数据发送回主进程。而不是return值,将它们放在队列中,主进程将在稍后的某个时刻检索它们。如果他们在进程尝试获取它们时没有准备好,默认情况下它只会阻塞(等待)直到它们可用

您的功能现在看起来像这样:

def cvsreader(string, q):
    q.put(np.genfromtxt(string, delimiter=',', unpack="true"))

主要例程是:

if __name__ == '__main__'
    q = multiprocessing.Queue()
    for i in range(2):
        p = multiprocessing.Process(target=csvreader, args=(string_array[i], q,))
        p.start()

# Do anything else you need in here

time=np.empty(2,dtype='object')
signal=np.empty(2,dtype='object')
for i in range(2):
    time[i], signal[i] = q.get() # Returns output or blocks until ready
    # Process my output

请注意,您必须为要回复的项目致电Queue.get()

有关更多示例和信息,请查看multiprocessing module上的文档。

答案 1 :(得分:0)

使用the introduction to the documentation中的示例:

if __name__ == '__main__':
    pool = Pool(2)
    results = pool.map(CSVReader.csvreader, string_array[:2])
    print(results)