为什么Python线程消耗这么多内存?

6 投票
1 回答
5326 浏览
提问于 2025-04-16 15:34

为什么Python线程消耗这么多内存呢?

我测量了一下,启动一个线程就要消耗8MB的内存,几乎和启动一个全新的Python进程一样大!

操作系统:Ubuntu 10.10

补充说明:因为大家对这个问题很感兴趣,我再给一些额外的例子:

from os import getpid
from time import sleep
from threading import Thread

def nap():
    print 'sleeping child'
    sleep(999999999)

print getpid()
child_thread = Thread(target=nap)
sleep(999999999)

在我的电脑上,使用pmap命令查看进程ID的内存使用情况,结果是9424K。

现在,我们来运行一个子线程:

from os import getpid
from time import sleep
from threading import Thread

def nap():
    print 'sleeping child'
    sleep(999999999)

print getpid()
child_thread = Thread(target=nap)
child_thread.start()             # <--- ADDED THIS LINE
sleep(999999999)

这时,使用pmap命令查看进程ID的内存使用情况,结果变成了17620K。

所以,额外线程的内存消耗就是17620K减去9424K,等于8196K。

也就是说,运行一个新的独立进程的87%内存消耗!

这难道不觉得有点不对劲吗?

1 个回答

17

这不是特指Python的问题,而是和操作系统为每个线程分配的独立栈有关。你操作系统的默认最大栈大小是8MB。

要注意,这8MB只是预留的一块地址空间,最开始并不会占用太多内存。当需要更多内存时,栈会逐渐增加,最多可以到8MB的限制。

你可以通过 ulimit -s 来调整这个限制,但在这种情况下,我觉得没有必要这么做。

顺便提一下,pmap 可以显示 地址空间 的使用情况,但这并不是衡量 内存 使用的好方法。这两个概念是不同的,虽然有关系。

撰写回答