【问题标题】:Turtle threaded parallel drawing海龟螺纹平行图
【发布时间】:2023-01-13 01:53:46
【问题描述】:

我目前正在尝试制作一个 sierpinski 三角形,它使用递归函数来创建使用 turtle 库(无法更改)同时绘制单个三角形的线程。问题是它一直告诉我RuntimeError: main thread is not in main loop

这是我用于线程创建和执行的代码,以及我修复它的一些尝试


def triangle_thread(x, y, size, invert=False):
    global turtles
    turtles.append(turtle.Turtle("turtle"))
    turtles[-1].speed("fastest")
    t = threading.Thread(target=partial(triangle, x, y, size, turtles[-1], invert=invert))
    t.daemon = True
    t.start()

这应该创建并启动一个绘制三角形的新线程 它显然有效。

我尝试了多种方法,以及一些队列技巧,但它不会同时绘制它们。

这是我最近修复它的尝试:

thread_sierpinski_recursive = threading.Thread(target=partial(sierpinski, -700, -500, 3, 1000))
thread_sierpinski_recursive.start()
turtle.mainloop()

我试图在一个单独的线程中运行整个 sierpinski 三角形生成,这样主线程就会运行turtle.mainloop

这适用于最多 4 代的 sierpinski,但是一旦您尝试更多,它就会返回相同的错误:

sierpinski(-700, -500, 3, 1000)
turtle.mainloop()

【问题讨论】:

    标签: python multithreading python-turtle


    【解决方案1】:

    我需要查看更多您的代码才能具体理解,但一般来说,绘制一个单独的三角形似乎太小而无法线程化,因为开销超过了整个过程。如果每个三角形都是一个复杂的计算,需要花费大量时间,那也没关系。同样,如果您将 Sierpinski 三角形分解成可以平行绘制的大段,这似乎也是合理的。

    下面是我刚刚从其他示例中提取的代码,这些示例使用线程递归地并行绘制科赫雪花的三个主要部分:

    from queue import Queue
    from functools import partial
    from turtle import Screen, Turtle
    from threading import Thread, active_count
    
    STEPS = 3
    LENGTH = 300
    
    def koch_curve(turtle, steps, length):
        if steps == 0:
            actions.put((turtle.forward, length))
        else:
            for angle in [60, -120, 60, 0]:
                koch_curve(turtle, steps - 1, length / 3)
                actions.put((turtle.left, angle))
    
    def process_queue():
        while not actions.empty():
            action, *arguments = actions.get()
            action(*arguments)
    
        if active_count() > 1:
            screen.ontimer(process_queue, 1)
    
    screen = Screen()
    actions = Queue(1)  # size = number of hardware threads you have - 1
    
    turtle1 = Turtle('turtle')
    turtle1.hideturtle()
    turtle1.speed('fastest')
    turtle1.color('red')
    turtle1.penup()
    turtle1.right(30)
    turtle1.backward(3**0.5 * LENGTH / 3)
    turtle1.left(30)
    turtle1.pendown()
    
    turtle2 = turtle1.clone()
    turtle2.color('green')
    turtle2.penup()
    turtle2.forward(LENGTH)
    turtle2.right(120)
    turtle2.pendown()
    
    turtle3 = turtle1.clone()
    turtle3.speed('fastest')
    turtle3.color('blue')
    turtle3.penup()
    turtle3.right(240)
    turtle3.backward(LENGTH)
    turtle3.pendown()
    
    thread1 = Thread(target=partial(koch_curve, turtle1, STEPS, LENGTH))
    thread1.daemon = True  # thread dies when main thread (only non-daemon thread) exits.
    thread1.start()
    
    thread2 = Thread(target=partial(koch_curve, turtle2, STEPS, LENGTH))
    thread2.daemon = True
    thread2.start()
    
    thread3 = Thread(target=partial(koch_curve, turtle3, STEPS, LENGTH))
    thread3.daemon = True
    thread3.start()
    
    process_queue()
    
    screen.exitonclick()
    

    但我不希望获得任何性能,只需以通常的方式绘制分形,提高乌龟速度或关闭跟踪。只是为了视觉效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 2018-05-20
      • 2014-03-18
      • 2021-08-26
      相关资源
      最近更新 更多