为什么Python线程消耗这么多内存?
为什么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
可以显示 地址空间 的使用情况,但这并不是衡量 内存 使用的好方法。这两个概念是不同的,虽然有关系。