我希望在Python中使用多个线程来计算一个图像的像素值,最终将被构造出来,尽管我很难弄清楚如何返回并收集线程的结果。设置如下:
将创建一个Queue.Queue()对象,以及一个threading.Thread()类子类:q = Queue.Queue()
class myThread(threading.Thread):
def __init__(self, queue):
self.queue = queue
threading.Thread.__init__(self)
def run(self):
while True: # loop forever
task = self.queue.get()
rs = self.do_work(task) # I've got the result; now what to do with it?
self.queue.task_done()
我的想法是收集500x500图像的像素数据,最初是250000(500x500)个元素的列表,最终将用PIL生成图像:
^{pr2}$
因此,我用每个像素的任务填充队列,并生成一个线程池:for i in range(5):
t = myThread(q)
t.setDaemon(True)
t.start()
for y in range(500):
for x in range(500):
q.put({'x':x, 'y':y})
q.join()
那么如何收集所有的数据呢?我认为将250000个元素列表传递给每个线程不是一个好主意,因为每个线程都会丢失来自其他线程的数据。在
编辑:
对于那些想知道是否值得用多线程的方式来计算图像坐标的人来说,计算图像坐标的工作是几个perlin噪声函数。它生成一个perlin2d噪声点阵列(5x5网格),加上几个倍频程(10x10、20x20和40x40网格),并计算这些点之间的像素值。因此,对于最终图像中的每个像素,它必须对每个倍频程进行三次数学运算(给定点周围的X点平均值,给定点周围的Y点平均值,以及这些平均值的平均值),然后在倍频程结果之间进行加权平均。在
在我的8核Mac上,我看到Python进程在运行时使用1个线程和100%的处理器。虽然我知道我有8个内核,并且已经看到进程表明有400-600%的处理器使用表明他们正在利用其他核心,我只是希望这个Python脚本也能做到这一点。在