我有一个 python 函数,它接受图像路径并根据图像是否为黑色输出真或假。我想在同一台机器上处理多个图像,如果其中一个不是黑色的,则停止该过程。我在这里阅读了很多关于 python、celery 等的多处理,但我不知道从哪里开始。
问问题
5218 次
2 回答
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.'
于 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 回答