Python中连接到套接字的线程的理想stack_size是什么?

Ich*_*ane 2 python sockets networking

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

我目前有这个设置:

threading.stack_size(524288)
Run Code Online (Sandbox Code Playgroud)

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

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

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

问候.

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

Jea*_*one 6

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

创建线程时必须分配此金额.它无法改变.

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

在CPython上,Python调用堆栈和C调用堆栈是相关的 - 尽管它们是分开的东西.

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

因此,如果你调整这个太低,你会发现你的应用程序将变得不可靠 - 故障表现为神秘的崩溃.

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

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