我有一个简单的python代码,试图将一批jpg文件转换为png。但是这个代码每次只在我的linux机器上产生一个子进程,这个代码有什么问题?
from scipy.misc import imread, imsave
from multiprocessing import Process, util
import logging
util.log_to_stderr(level=logging.DEBUG)
def imgcvt(inf, outf):
im=imread(inf)
imsave(outf,im)
for i in range(3):
run_list = [];
threads = [];
for j in range(1,21):
fn = str(i*20+j+1)
run_list.append((fn+".jpg", fn+".png"))
for dev in run_list:
proc = Process(target=imgcvt, args=dev)
proc.start()
proc.join()
感谢
答案 0 :(得分:1)
在开始每个进程后执行proc.join()
意味着您在等待它继续之前终止。
相反,您应该将所有Process
个对象存储到列表中,然后加入所有这些对象:
processes = []
for dev in run_list:
proc = Process(target=imgcvt, args=dev)
proc.start()
processes.append(proc)
for proc in processes:
proc.join()
答案 1 :(得分:0)
考虑使用multiprocessing.Pool
对象。它启动一些过程,然后并行转换您的图像,直到它们全部完成。它很好,因为它易于控制,并将每个函数的信息返回给原始调用者。
import multiprocessing, time
def convert( (inpath,outpath) ):
if 1:
time.sleep(1)
print 'convert:',inpath,outpath
else:
im = imread(inpath)
imsave(outpath, im)
return outpath
if __name__=='__main__':
run_list = []
for j in range(5):
fn = str(j+1)
run_list.append( (fn+".jpg", fn+".png") )
pool = multiprocessing.Pool() # one Process per CPU
print pool.map(convert, run_list)
pool.close()
pool.join() # wait for all jobs to finish
convert: 3.jpg 3.png
convert: 2.jpg 2.png
convert: 4.jpg 4.png
convert: 1.jpg 1.png
convert: 5.jpg 5.png
['1.png', '2.png', '3.png', '4.png', '5.png']