gpt4 book ai didi

python - 如何减少线程 python 代码的内存使用?

转载 作者:太空狗 更新时间:2023-10-29 21:44:20 27 4
gpt4 key购买 nike

我编写了大约 50 个类,用于使用机械化和线程连接和处理网站。他们都同时工作,但他们并不相互依赖。所以这意味着 1 个类 - 1 个网站 - 1 个线程。这不是特别优雅的解决方案,特别是对于管理代码,因为很多代码在每个类中重复(但还不足以使其成为一个类来传递参数,因为某些站点可能需要在方法中间对检索到的数据进行额外处理- 就像“登录”一样 - 其他人可能不需要)。正如我所说,它并不优雅——但它确实有效。不用说,我欢迎所有关于如何在不为每个网站方法使用 1 个类的情况下更好地编写它的建议。为每个类添加额外的功能或整体代码管理是一项艰巨的任务。

但是,我发现每个线程占用大约 8MB 内存,因此对于 50 个正在运行的线程,我们会看到大约 400MB 的使用量。如果它在我的系统上运行,我不会有问题,但由于它在只有 1GB 内存的 VPS 上运行,它开始成为一个问题。您能否告诉我如何减少内存使用量,或者是否有任何其他方法可以同时处理多个站点?

我使用这个快速测试 python 程序来测试是存储在我的应用程序变量中的数据正在使用内存,还是其他东西。正如您在下面的代码中看到的,它只处理 sleep() 函数,但每个线程都使用 8MB 的内存。

from thread import start_new_thread
from time import sleep

def sleeper():
try:
while 1:
sleep(10000)
except:
if running: raise

def test():
global running
n = 0
running = True
try:
while 1:
start_new_thread(sleeper, ())
n += 1
if not (n % 50):
print n
except Exception, e:
running = False
print 'Exception raised:', e
print 'Biggest number of threads:', n

if __name__ == '__main__':
test()

当我运行它时,输出是:

50
100
150
Exception raised: can't start new thread
Biggest number of threads: 188

通过删除 running = False 行,我可以在 shell 中使用 free -m 命令测量空闲内存:

             total       used       free     shared    buffers     cached
Mem: 1536 1533 2 0 0 0
-/+ buffers/cache: 1533 2
Swap: 0 0 0

为什么我知道每个线程占用大约 8MB 的实际计算很简单,除以上述测试应用程序运行之前和期间使用的内存差异,除以它设法启动的最大线程数。

可能只是分配了内存,因为通过查看 top,python 进程只使用了大约 0.6% 的内存。

最佳答案

关于python - 如何减少线程 python 代码的内存使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8796654/

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