>“由于GIL,一个线程一次运行.”好吧, GIL意味着只有一个线程可以一次执行Python代码.但是,任何数量的线程都可能正在执行IO,各种其他系统调用或其他不支持GIL的代码.
听起来你的线程主要是网络I / O,任何数量的线程都可以同时进行I / O. GIL比赛可能会相当激烈,有1000个线程,但是您可以随时创建多个Python进程并在它们之间划分I / O线程(即在开始之前fork几次).
>“Linux内核默认情况下只为线程预留8Meg”.我不知道你听到了什么.也许你实际听到的是“在Linux上,默认的堆栈大小通常是8 MiB”,这是真的.每个线程将使用8个MiB的堆栈地址空间(64位无问题)以及附加内存映射和线程进程本身的内核资源.您可以使用threading.stack_size库函数更改堆栈大小,这有助于您有很多线程不进行深层调用.
>>> import threading
>>> threading.stack_size()
0 # platform default, probably 8 MiB
>>> threading.stack_size(64*1024) # 64 KiB stack size for future threads
>这个线程中的其他人建议使用异步/非阻塞框架.嗯,你可以这样做然而,在现代Linux内核上,多线程模型与异步(select / poll / epoll)I / O复用技术具有竞争力.重写代码以使用异步模型是一项非常简单的工作,因此如果我无法从线程模型获得所需的性能,我只会执行此操作.如果你的线程真的试图模拟人类的延迟(例如,花费大部分时间睡觉),那么很多情况下异步方法实际上更慢.我不知道这是否适用于Python,其中减少的GIL争用可能值得切换.