多处理的python代码每次只产生一个进程

时间:2014-09-07 13:22:13

标签: python multithreading

我有一个简单的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()

感谢

2 个答案:

答案 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']