2013-02-08 3 views
0

이미지 경로를 가져 와서 이미지가 검은 색인지 아닌지에 따라 true 또는 false를 출력하는 python 함수가 있습니다. 같은 기계에서 여러 이미지를 처리하고 그 중 하나라도 검은 색이 아닌 경우 프로세스를 중단하고 싶습니다. 파이썬, 셀러리 등에서 멀티 프로세싱을 많이 읽었지 만 어디에서 시작해야할지 모르겠습니다.이미지 처리를위한 파이썬 다중 프로세스 실행

답변

2

나는 즉시 Pools을보고 프로세스를 쉽게 만들 것을 제안합니다. 공유 상태가 필요한 경우이 경우 검정색이 아닌 이미지가 있음을 나타내는 부울은 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.' 
+0

내 프로세스를 생성하는 작업 코드가 있는데 잘 작동하지만 프로세스의 함수가 False를 반환하면 종료 할 수 없습니다. – alok

+0

풀을 사용하는 경우 종료를 사용할 수 있습니다. 방법을 알려주는 업데이트를 추가했습니다. 하위 분류 프로세스 인 경우 계산을 시작하기 전에 'image_found'가 False인지 확인하십시오. – owobeid

+0

코드 예제를 가져 주셔서 감사하지만 예제에서 'p'가 'processImage'함수의 범위에서 변수로 인식되지 않아이 함수 내부에서 p.terminate()를 호출 할 수 없기 때문에 오류가 발생합니다. 내가 틀렸다면 나를 바로 잡아라. – alok

0

마지막으로 나에게 적합합니다. 예 : here에서 복사했습니다. 설명을 위해 저는 _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 
관련 문제