2

我有一个生成 300 个线程的 Python 脚本。每个线程连接到给定端口上的套接字并平均接收大约 500 个字符,直到它关闭套接字。

我目前有这个设置:

threading.stack_size(524288)

这意味着 512KB。我只用了 128KB 就试了一下,它在非常小的一组测试中运行良好。但我不知道我所做的是否正确。理想情况下,我想将大小设置为低于 128KB。

所以,我的问题是,我拥有的一种套接字连接可以在 AVERAGE 中使用多少 RAM?我知道它在某种程度上是一个非标准问题,而且我知道它在很多方面都有所不同,但我只想听一些平均数字。如果我只使用 64KB 或更少可以吗?

感谢您花时间阅读本文,我将感谢您的回答。

问候。

一个很好的线程示例可能是尝试发送电子邮件。

4

1 回答 1

7

设置的堆栈大小threading.stack_size是为线程中的调用堆栈分配的内存量。

必须在创建线程时分配此数量。它不能改变。

不出所料(我希望)这个值限制了调用堆栈上可以存在的帧数。令人惊讶的是(也许)它适用于 C 调用堆栈——而不是 Python 调用堆栈。

在 CPython 上,Python 调用堆栈和 C 调用堆栈是相关的——尽管它们是不同的东西。

这意味着,如果您在线程中运行的 Python 代码进行了足够多的调用以使 C 调用堆栈足够深,以至于它需要比您允许使用的内存更多的内存,threading.stack_size那么您的 Python 进程将崩溃。

因此,如果您将其调整得太低,您会发现您的应用程序将变得不可靠——故障表现为神秘的崩溃。

再次重申,这里有两个概念。首先,启动线程时实际分配的内存量是由threading.stack_size. 其次,线程的调用堆栈实际需要使用的内存量。前者必须始终至少与后者一样大,才能使您的程序正常工作。您可以使用控制前者,threading.stack_size但只能通过编写程序的方式控制后者。

如果您想节省内存,请考虑在一个线程中全部使用非阻塞套接字(简单地使用非阻塞套接字不会减少内存使用量 - 但使用一个线程而不是 300 个线程肯定会减少内存使用量)。

于 2013-10-16T15:19:25.457 回答