所以,我试图通过在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,但我不太了解它。 有没有简单明了的方法?
答案 0 :(得分:3)
您最好的选择是multiprocessing.Queue
或multiprocessing.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)