gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:35:07 25 4
gpt4 key购买 nike

我正在使用 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

谢谢

最佳答案

摘要:每个 Tk 小部件只能在单个线程中使用;实现内部使用了大量特定于线程的数据,因此这是一个非常困难的要求。你的黑客行为无法解决这个问题。

详细信息: Python 在幕后与 Tcl 通信以与 Tk 一起工作,并且线程 Tcl 被设计为强线程绑定(bind)(以避免出现 GIL 之类的东西)。可以使用非线程构建,但是随后您会遇到防止堆栈溢出的代码问题(这是一个非常讨厌的黑客行为),当它认为它是非线程时,它会因多个 C 堆栈的存在而感到困惑。 这是您报告的特定错误的来源部分。堆栈检查代码在 Tcl 8.6(使用“无堆栈”实现)中被删除,但这不太可能有帮助因为除非您处于线程构建中,否则不会尝试处理线程间锁定问题(这会让您回到线程特定的数据问题)。

非线程模式下的 Tk 对全局共享数据做出了很多假设,并且在多个线程中使用确实不安全(所涉及的线程代码的质量不是您所希望的,其中大部分可以追溯到底层操作系统库通常也不擅长线程处理)。线程模式下的 Tk 广泛使用 TSD;在线程模式下使用 Tk 的唯一方法是每个线程都有自己的主窗口和事件循环,并且永远将它们之间的内容混合起来。

最简单的事情是保留一个线程专门用于管理 GUI(通常是主应用程序线程)并将所有非 GUI 工作移至其他线程。

关于python - 在Windows上为python编译线程安全的tcl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17540180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com