Multithreading 交通堵塞

Multithreading 交通堵塞,multithreading,python-3.x,tkinter,Multithreading,Python 3.x,Tkinter,我有一个通过Tkinter回调调用的昂贵函数: def func: # called whenever there is a mouse press in the screen. print("Busy? " + str(X.busy)) # X.busy is my own varaible and is initialized False. X.busy = True do_calculations() # do_calculations contains sever

我有一个通过Tkinter回调调用的昂贵函数:

def func:  # called whenever there is a mouse press in the screen.
   print("Busy? " + str(X.busy))  # X.busy is my own varaible and is initialized False.
   X.busy = True
   do_calculations()  # do_calculations contains several tk.Canvas().update() calls
   X.busy = False
当我点击得太快时,func()会堆积起来,因为打印结果显示为“Busy?True”,表示函数尚未完成,我们正在另一个线程上启动它


然而,print(threading.current_thread())总是给出。。。对于给定的程序运行,每次打印总是相同的。同一个线程怎么可能是多个线程?

在我看来,您正在运行递归消息处理。特别是,
tk.Canvas().update()
将处理任何挂起的消息,包括额外的按钮单击。此外,它将在同一线程上执行此操作(至少在Windows上)


因此,线程ID是常量,但堆栈跟踪将有多个嵌套调用
func

,我认为X.busy不会启动新线程。不是真正的tkinter专家,但我找不到一个说明它确实旋转线程的引用。X只是一个(静态)类,它包含我的一个变量。func是从tkinter.OK调用的-为什么您认为您的代码会启动一个新线程?还有,你在哪个平台上运行?至少在Windows上,Tkinter回调是从消息循环驱动的,因此都在同一线程上运行。如果没有多个线程或一个被中止的线程,这怎么可能发生呢?。。。这就是为什么你永远不应该调用
update
,直到你确切了解了为什么你永远不应该调用
update