在Windows上为python编译线程安全的tcl

时间:2013-07-09 04:53:24

标签: python multithreading tcl

我正在用Python做一个项目,我需要在线程中添加一些内容。原来,如果你做一些在线程中使用Tk的东西,它会以某种方式崩溃。 错误是:

TclError: out of stack space (infinite loop?)`

我在Google上搜索过,我认为这可能是因为Tcl不是线程安全的。当我运行这个时,我得到了Tcl错误:

import Tkinter    
Tkinter.Tk().getvar("tcl_platform(threaded)")

据说使用--enable-threads重新编译tcl可以解决这个问题。我的问题是如何在Windows中重新编译tcl。以及如何用已编译的那个替换当前的那个。我正在使用Python 2.7和Tcl 8.5

由于

1 个答案:

答案 0 :(得分:3)

摘要:每个Tk小部件只能在一个线程中使用;在实现中使用了很多特定于线程的数据,因此这是一个非常困难的要求。你的黑客行为不会绕过这个。

详细信息: Python与Tcl进行通信以便与Tk一起工作,并且线程Tcl被设计为强线程绑定(以避免像GIL那样)。可以使用非线程构建,但是你会遇到代码问题,以防止堆栈溢出(一个非常讨厌的黑客攻击),当它认为它没有线程时,会被多个C堆栈的存在弄糊涂。 这是您报告的特定错误来自的部分。 在Tcl 8.6(使用“无堆栈”实现)中删除了堆栈检查代码,但这不太可能有帮助因为没有尝试处理线程间锁定问题,除非您处于线程构建中(并且会将您带回特定于线程的数据问题)。

非线程模式下的Tk对全局共享数据做了很多假设,并且从多个线程中使用是非常不安全的(所涉及的线程代码的质量不是你想要的,其中大部分时间可以追溯到底层的OS库通常也不太擅长线程处理。线程模式下的Tk广泛使用TSD;在线程模式下使用Tk的唯一方法是每个线程都有自己的主窗口和事件循环,并且永远不会在它们之间混合。

最简单的方法是保留一个专用于管理GUI的线程(通常是主应用程序线程),并将所有非GUI工作移动到其他线程中。