【问题标题】:python code with mulitprocessing only spawns one process each time具有多处理功能的 python 代码每次只产生一个进程
【发布时间】:2014-10-31 20:51:22
【问题描述】:

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

谢谢

【问题讨论】:

    标签: python multithreading


    【解决方案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()
    

    【讨论】:

      【解决方案2】:

      考虑使用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']
      

      【讨论】:

        猜你喜欢
        • 2021-03-28
        • 1970-01-01
        • 2018-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多