如何从python中的多个线程收集数据?
|
我想在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图像的像素数据,该图像最初是250,000(500x500)元素的列表,最终将通过PIL制成图像:
pixels = array.array(\'B\', pixels).tostring()
im = Image.fromstring(\'L\', size, pixels)
im.show()
因此,我将每个像素的任务填充到队列中,并生成线程池:
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()
那么如何获取所有收集的数据呢?我认为将250,000个元素列表传递给每个线程是一个坏主意,既要传递要传递的数据数组的大小,又因为每个线程会丢失其他线程的数据。
编辑:
对于那些想知道以多线程方式进行操作是否值得的人来说,用于计算图像坐标的工作是几个perlin噪声函数。它生成点的Perlin 2D噪声数组(5x5网格),以及几个八度音阶(10x10、20x20和40x40网格),并计算这些点之间的像素值。因此,对于最终图像中的每个像素,每个八度必须执行三个数学运算(在给定点周围平均X个点,在给定点周围平均Y个点,然后平均那些平均值),然后在八度结果之间进行加权平均。
在我的8核Mac上,运行时我看到Python进程使用1个线程和100%的处理器。尽管我知道我有8个内核,并且看到进程表明400-600%的处理器使用率表明它们正在利用其他内核,但我只是希望这个Python脚本可以做到这一点。
没有找到相关结果
已邀请:
3 个回复
眠皇
佃蒜狗掂哥
傻零凰死授