加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

多线程Python脚本比非线程脚本花费更长时间

发布时间:2020-12-15 04:52:54 所属栏目:Java 来源:网络整理
导读:免责声明:我对多线程非常糟糕,所以我完全有可能做错了. 我在Python中编写了一个非常基本的光线跟踪器,我一直在寻找可能加速它的方法.多线程似乎是一种选择,所以我决定尝试一下.但是,虽然原始脚本需要大约85秒来处理我的示例场景,但多线程脚本最终需要大约12
免责声明:我对多线程非常糟糕,所以我完全有可能做错了.

我在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,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,self.scene)
        q.task_done()

    def getPixelColor(x,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,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)

有什么明显的东西我做错了吗?或者我错误地假设多线程会对这样的进程提速?

解决方法

我怀疑Python Global Interpreter Lock会阻止您的代码同时在两个线程中运行.

What is a global interpreter lock (GIL)?

显然,您希望利用多个CPU.你能跨进程而不是线程分割光线跟踪吗?

多线程版本显然做了更多“工作”,所以我希望它在单个CPU上更慢.

我也不喜欢继承Thread,只是用t = Thread(target = myfunc)构造一个新线程; t.run()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读