0
我不知道如何通过多处理工作来计算坏像素我到目前为止没有多处理并分析需要分析的10张图片大约需要7分钟...通过在Python中使用多处理来计算死像素
import random
import time
from multiprocessing import Process, Queue, current_process, freeze_support
from PIL import Image, ImageDraw
image1 = Image.open('MA_HA1_drawing_0.png')
image2 = Image.open('MA_HA1_drawing_1.png')
image2 = Image.open('MA_HA1_drawing_2.png')
image3 = Image.open('MA_HA1_drawing_3.png')
image4 = Image.open('MA_HA1_drawing_4.png')
image5 = Image.open('MA_HA1_drawing_5.png')
image6 = Image.open('MA_HA1_drawing_6.png')
image7 = Image.open('MA_HA1_drawing_7.png')
image8 = Image.open('MA_HA1_drawing_8.png')
image9 = Image.open('MA_HA1_drawing_9.png')
def analyze_picture(image):
time.sleep(0.5*random.random())
counter = 0
for x in range(616,6446):
for y in range(756,3712):
r,g,b = image.getpixel((x,y))
if r != 1 and g != 1 and b != 1:
counter += 1
return counter
def test():
NUMBER_OF_PROCESSES = 4
TASKS1 = [(analyze_picture(image1))]
TASKS2 = [(analyze_picture(image2))]
TASKS3 = [(analyze_picture(image2))]
TASKS4 = [(analyze_picture(image3))]
TASKS5 = [(analyze_picture(image4))]
TASKS6 = [(analyze_picture(image5))]
TASKS7 = [(analyze_picture(image6))]
TASKS8 = [(analyze_picture(image7))]
TASKS9 = [(analyze_picture(image8))]
TASKS10 = [(analyze_picture(image9))]
print TASKS1
if __name__ == '__main__':
freeze_support()
test()
他们给了我们一些功能来理解多处理并将其用于我们的任务,但我不理解他们,也不知道如何使用它们。
def worker(input, output):
for func, args in iter(input.get, 'STOP'):
result = calculate(func, args)
output.put(result)
def calculate(func, args):
result = func(*args)
return '%s says that %s%s = %s' % \
(current_process().name, func.__name__, args, result)
def mul(a, b):
time.sleep(0.5*random.random())
return a * b
def plus(a, b):
time.sleep(0.5*random.random())
return a + b
# Create queues
task_queue = Queue()
done_queue = Queue()
# Submit tasks
for task in TASKS1:
task_queue.put(task)
# Start worker processes
for i in range(NUMBER_OF_PROCESSES):
Process(target=worker, args=(task_queue, done_queue)).start()
print i
# Get and print results
print 'Unordered results:'
for i in range(len(TASKS1)):
print '\t', done_queue.get()
# Add more tasks using `put()`
for task in TASKS2:
task_queue.put(task)
# Get and print some more results
for i in range(len(TASKS2)):
print '\t', done_queue.get()
# Tell child processes to stop
for i in range(NUMBER_OF_PROCESSES):
task_queue.put('STOP')
print 'process ', i, ' is stopped'
编辑:新代码
import random
import time
from multiprocessing import Process, Queue, current_process, freeze_support
from PIL import Image, ImageDraw
def worker(input, output):
for func, args in iter(input.get, 'STOP'):
result = calculate(func, args)
output.put(result)
def calculate(func, args):
result = func(args)
return '%s says that %s%s has %s dead pixels\n' % \
(current_process().name, func.__name__, args, result)
def analyze_picture(image_name):
t1 = time.clock()
image = Image.open(image_name)
time.sleep(0.5*random.random())
counter = 0
for x in range(616,6446):
for y in range(756,3712):
r,g,b = image.getpixel((x,y))
if r != 1 and g != 1 and b != 1:
counter += 1
t2 = time.clock()
dt = t2 - t1
print '\tThe process takes ',dt,' seconds.\n Result:\n'
return counter
def test():
NUMBER_OF_PROCESSES = 4
TASKS1 = [(analyze_picture, image_names[i]) for i in range(10)]
print TASKS1
# Create queues
task_queue = Queue()
done_queue = Queue()
# Submit tasks
for task in TASKS1:
task_queue.put(task)
# Start worker processes
for i in range(NUMBER_OF_PROCESSES):
Process(target=worker, args=(task_queue, done_queue)).start()
print i
# Get and print results
print 'Unordered results:'
for i in range(len(TASKS1)):
print '\t', done_queue.get()
# Tell child processes to stop
for i in range(NUMBER_OF_PROCESSES):
task_queue.put('STOP')
print 'process ', i, ' is stopped'
if __name__ == '__main__':
image_names =[('MA_HA1_drawing_'+str(i)+'.png') for i in range(10)]
freeze_support()
test()
嗨@Chickenmarkus非常感谢你的详细答复。我很感激它,我试过它,然后你给我的答案,我得到它的工作,但现在我有另一个问题,结果是这样的https://pastebin.com/gsviTkLj ,但我想它像 该过程需要x秒 结果 图像X满足x坏点 而不是 过程耗时x秒 结果 这个过程需要x秒...... 我将编辑我的问题,用新的代码,所以你能看到,也许是问题 –
的在'analyze_picture()'中打印时间,'test()'中结果的打印是由于多处理而异步运行的。工人通常不应该印刷一些东西(因为不确定的不同步,而且通常有很多工人)。让worker只返回值(或字符串),而只在主进程test()中打印它。 – Chickenmarkus