线程池的限制来自哪里?

时间:2018-04-23 11:01:02

标签: python python-3.x python-multiprocessing

使用以下代码,我发现multiprocessing.pool.ThreadPool的最大大小为11689(在我的机器上)。如果我把它变大,我会得到

  

RuntimeError:无法启动新线程

有人可以解释这是从哪里来的吗? 11689看起来像一个奇怪的系统常数...所以也许我用完了资源?

请注意:这不是关于如何为线程池选择最佳线程数。这个问题是关于11689的来源?

代码

1 个答案:

答案 0 :(得分:0)

简要介绍CPython源代码处理threads表明,当线程创建失败时,解释器不会delving into details太多。它只会提高你看到的RuntimeError

根据pthread_create联机帮助页,线程创建可能会失败,并显示以下错误代码和原因。

  

EAGAIN创建另一个线程的资源不足。

     

EAGAIN遇到系统强加的线程数限制。有许多限制可能会触发此错误:RLIMIT_NPROC软资源限制(通过setrlimit(2)设置),这限制了pro-的数量                 达到了真实用户ID的cesses和线程;已达到内核对进程和线程数量的系统范围限制/ proc / sys / kernel / threads-max(参见proc(5));或者最大PID数,                 达到/ proc / sys / kernel / pid_max(参见proc(5))。

     

...

我的盲目猜测是你遇到了第一个问题,而不是第二个问题。您可能正在耗尽内存以分配新线程。

可以在this link找到有关线程创建失败方式的更深入解释。

这是一个盲目的猜测。解释器更冗长的错误处理肯定会有所帮助。