使用 Python Turtle 进行多线程处理

Ham*_*FzM 4 python multithreading turtle-graphics python-3.x

有没有办法同时使用两只海龟在一个窗口中同时画两个圆?我试过这段代码,但两只海龟在分开的窗口中绘制

from multiprocessing import Process
import turtle

t1=turtle.Turtle()
t2=turtle.Turtle()

def tes1():
  t1.speed(0)
  i=0
  while i < 360:
    t1.forward(1)
    t1.left(1)
    i+=1

def tes2():
  t2.speed(0)
  i=0
  while i < 360:
    t2.forward(1)
    t2.right(1)
    i+=1

if __name__ == '__main__':
  p1 = Process(target=tes1)
  p1.start()
  p2 = Process(target=tes2)
  p2.start()
  p1.join()
  p2.join()
Run Code Online (Sandbox Code Playgroud)

但是有人告诉我尝试多线程但是这段代码有一个糟糕的语义错误!!

import threading
import turtle

t1=turtle.Turtle()
t2=turtle.Turtle()

def tes1():
  t1.speed(0)
  i=0
  while i < 360:
    t1.forward(1)
    t1.left(1)
    i+=1

def tes2():
  t2.speed(0)
  i=0
  while i < 360:
    t2.forward(1)
    t2.right(1)
    i+=1

t = threading.Thread(target=tes1)
t.daemon = True  # thread dies when main thread (only non-daemon thread) exits.
t.start()

t3 = threading.Thread(target=tes2)
t3.daemon = True  # thread dies when main thread (only non-daemon thread) exits.
t3.start()
Run Code Online (Sandbox Code Playgroud)

多处理或多线程的最佳建议是什么?

cdl*_*ane 6

...我想要多线程或多处理的答案,我坚持它。

如果我们小心翼翼地走钢丝,只有主线程发出海龟命令,海龟模块可以与线程一起使用:

import queue
import threading
import turtle

def tes1():
    for _ in range(360):
        graphics.put(turtle1.forward)
        graphics.put(turtle1.left)

def tes2():
    for _ in range(360):
        graphics.put(turtle2.forward)
        graphics.put(turtle2.right)

def process_queue():
    while not graphics.empty():
        (graphics.get())(1)

    if threading.active_count() > 1:
        turtle.ontimer(process_queue, 100)

graphics = queue.Queue(1)  # size = number of hardware threads you have - 1

turtle1 = turtle.Turtle('turtle')
turtle1.speed('fastest')
thread1 = threading.Thread(target=tes1)
thread1.daemon = True  # thread dies when main thread (only non-daemon thread) exits.
thread1.start()

turtle2 = turtle.Turtle('turtle')
turtle2.speed('fastest')
thread2 = threading.Thread(target=tes2)
thread2.daemon = True  # thread dies when main thread (only non-daemon thread) exits.
thread2.start()

process_queue()

turtle.exitonclick()
Run Code Online (Sandbox Code Playgroud)

我们使用 queue 模块进行线程安全通信。

在此处输入图片说明


for*_*ord 3

海龟真的有必要在不同的线程中吗?那这个呢?

import turtle

t1 = turtle.Turtle()
t2 = turtle.Turtle()

t1.speed(0)
t2.speed(0)
for i in range(360):
  t1.forward(1)
  t1.left(1)
  t2.forward(1)
  t2.right(1)
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是一个糟糕的解决方案,因为与 cdlane 给出的解决方案相反,您无法单独管理每只海龟的抽牌。 (3认同)