如何从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脚本可以做到这一点。     
已邀请:
Python具有用于修改python级别数据结构的全局锁,称为GIL。这使得很难有效地执行您想对线程执行的操作。 但是,绝望不是!善良的开发人员为我们提供了多处理模块。用多处理替换线程(改为使用multiprocessing.Process和multiprocessing.Queue),瞧,您的应用程序是一个多进程应用程序。 关于您的问题,您想要另一个队列,朝另一个方向前进。     
我认为您应该使用两个队列。 一种用于作业/任务,另一种用于输出。 任务完成后,将结果放入输出队列。     
我将有一个全局列表,每个线程都可以访问。我实际上遇到过这样的情况,并且那样做没有问题。     

要回复问题请先登录注册