【发布时间】:2010-08-11 19:09:51
【问题描述】:
免责声明:我在多线程方面非常糟糕,所以我完全有可能做错了什么。
我已经用 Python 编写了一个非常基本的光线追踪器,并且我正在寻找可能加快它的方法。多线程似乎是一种选择,所以我决定尝试一下。然而,虽然原始脚本需要大约 85 秒来处理我的示例场景,但多线程脚本最终需要大约 125 秒,这似乎很不直观。
这是原始的样子(我不会在这里复制绘图逻辑和内容。如果有人认为需要找出问题所在,我会继续将其放回原处):
def getPixelColor(x, y, scene):
<some raytracing code>
def draw(outputFile, scene):
<some file handling code>
for y in range(scene.getHeight()):
for x in range(scene.getWidth()):
pixelColor = getPixelColor(x, y, scene)
<write pixelColor to image file>
if __name__ == "__main__":
scene = readScene()
draw(scene)
这是多线程版本:
import threading
import Queue
q = Queue.Queue()
pixelDict = dict()
class DrawThread(threading.Thread):
def __init__(self, scene):
self.scene = scene
threading.Thread.__init__(self)
def run(self):
while True:
try:
n, x, y = q.get_nowait()
except Queue.Empty:
break
pixelDict[n] = getPixelColor(x, y, self.scene)
q.task_done()
def getPixelColor(x, y, scene):
<some raytracing code>
def draw(outputFile, scene):
<some file handling code>
n = 0
work_threads = 4
for y in range(scene.getHeight()):
for x in range(scene.getWidth()):
q.put_nowait((n, x, y))
n += 1
for i in range(work_threads):
t = DrawThread(scene)
t.start()
q.join()
for i in range(n)
pixelColor = pixelDict[i]
<write pixelColor to image file>
if __name__ == "__main__":
scene = readScene()
draw(scene)
有什么明显的我做错了吗?还是我假设多线程会提高这样的进程的速度是不正确的?
【问题讨论】:
-
如果你正在做大量的数学运算并且不喜欢以“C”开头的语言,我会尝试使用 numpy 或者 Psyco。
标签: python multithreading