【问题标题】:Is memory use restricted in python threads?python线程中的内存使用是否受到限制?
【发布时间】: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


【解决方案1】:

子线程没有内存限制。

(我鼓励 favouretti 或 mcy 发布类似的答案以供接受,因此这不会加入未回答问题的无限队列。OP 回答他自己的问题并没有错。)

【讨论】:

  • 你的已经够好了!看起来我的问题是 PyInstaller 问题,而不是 GUI 或线程问题。一旦我弄清楚了,我会发布另一个问题/答案。
猜你喜欢
  • 2023-03-09
  • 2011-03-10
  • 2011-05-14
  • 2022-06-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2013-02-05
  • 2010-11-15
相关资源
最近更新 更多