【发布时间】:2012-02-06 11:22:23
【问题描述】:
我编写了大约 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% 的内存。
【问题讨论】:
-
什么占用了内存?我冒昧地猜测这是您从网站中提取的数据。如果是这种情况,那么除了限制执行线程的数量之外,您可能无能为力。
-
您如何准确测量内存使用情况?我猜,那些 8MB 并没有真正分配给每个线程。这 8MB 的很大一部分可能在线程之间共享(只是猜测..)?
-
这是主机吗?
ulimit -u呢?和ulimit -a? -
@Andrew:所以,您粗略地测量了 python 中单个线程的开销。毕竟,现在 8MB 听起来很合理......
-
@andrew,
ulimit -s可以固定,limit pam module 它们是每个参数的软值和硬值。您还可以在 bash.rc 中为每个用户分配自定义限制。例如查看 Oracle 文档,Oracle server needs to customize this parameters to work properly。
标签: python multithreading memory-management