【发布时间】:2017-12-21 10:37:17
【问题描述】:
Python 2.7。我有一个用 Tkinter 编写的 GUI,它创建一个单独的线程来运行任务,以便 GUI 在运行时不会被阻塞。任何地方都没有实现锁定:
class MainWindow(Tkinter.Tk):
def __init__(self):
Tkinter.Tk.__init__(self)
self.initialize()
def initialize(self):
# Configure the window, buttons etc
def button_function(self):
t = threading.Thread(target=self.myfunction)
t.daemon = True
t.start()
return
def myfunction(self);
# Calls a function in an imported module
当我运行它时,GUI 挂起,然后崩溃而没有回溯。如果我在主线程中调用该函数,它不会崩溃(尽管 GUI 在 myfunction 运行时会“冻结”):
def button_function(self):
self.myfunction() # Runs fine
return
函数本身有时会在运行时在内存中存储数 MB。注释掉较大的变量可以让函数成功返回。
我应该补充一点,子线程不调用 GUI 函数。 GUI 只是一个单独的命令行函数的包装器。
我怀疑正确的解决方案是将较大的变量写入临时文件,或者重新构建函数以更频繁地返回主线程。
子线程的内存使用是否有限制,如果有,如何配置?
【问题讨论】:
-
子线程没有内存限制。没有回溯的崩溃是环境问题,而不是 python 内部问题。你在哪里运行你的代码?哪个操作系统、笔记本电脑/服务器等?
-
@favoretti 很好的建议,谢谢!我在 Windows 10 笔记本电脑上运行。您的回复促使我在 Linux VM 上尝试此操作,虽然我没有遇到同样的问题,但它确实表明线程函数正在调用 pyplot.close(),它需要在主线程中运行( github.com/idlespork/idlespork/issues/8)。如果您想回答“子线程中没有内存限制”,我将标记为已接受的答案。
-
没关系,我看到其他人已经添加了这个答案:)
标签: python multithreading python-2.7 memory