0

画像パスを受け取り、画像が黒かどうかに応じてtrueまたはfalseを出力するPython関数があります。同じマシンで複数の画像を処理し、そのうちの1つでも黒でない場合は処理を停止したいと思います。ここではPythonやセロリなどのマルチプロセッシングをたくさん読んでいますが、どこから始めればよいのかわかりません。

4

2 に答える 2

2

その場で簡単にプロセスを作成するには、プールを検討することをお勧めします。共有状態が必要な場合 (この場合、黒以外の画像を示すブール値が見つかった場合)、Managersを確認してください。

更新:これが私が意味することの例です。

import multiprocessing.Manager as Manager
import multiprocessing.Pool as Pool

m = Manager()
p = Pool(processes=5)

state_info = m.dict()
state_info['image_found'] = False

def processImage(img):

    # ... Process Image ...

    if imageIsBlack(img):
        state_info['image_found'] = True
        p.terminate()

 p.apply(processImage, imageList)

 if state_info['image_found']:
     print 'There was a black image!!'
 else:
     print 'No black images were found.'
于 2013-02-08T21:59:46.547 に答える
1

最後に、これは私にとってうまく機能します。ここの例からコピーしました。説明のために、_isImgNonBlack 関数と画像シーケンスを 0 と 1 のリストに置き換えました。0 は黒の画像、1 は黒以外の画像です。

import multiprocessing

def isImgNonBlack(result_queue, imgSeq):
    for img in imgSeq:
        # If a non-black is found put a result
        if img==1:
            result_queue.put(1)

    # else put a zero as the result
    result_queue.put(0)

if __name__ == '__main__':
    processs = []
    result_queue = multiprocessing.Queue()
    nbProc = 20

    # making a fake list of images with 
    # 10,000 0's follwed by a single 1
    images = [0 for n in range(10000)]
    images.append(1)

    for n in range(nbProc): # start processes crawling for the result
        process = multiprocessing.Process(target=isImgNonBlack, args=[result_queue, images])
        process.start()
        processs.append(process)
        print 'Starting Process : %s' % process

    result = result_queue.get() # waits until any of the proccess have `.put()` a result

    for process in processs: # then kill them all off
        process.terminate()

    # finally print the result
    print "Seq have a non black img: %s" % result
于 2013-02-12T16:24:42.060 に答える