Вы достигли жесткого предела. Как уже говорили другие, могут быть два ограничения:
- количество потоков, которые может породить процесс, ограничено ОС (глобально или для процесса)
- доступная память ограничена, и каждый поток резервирует свой собственный стек (обычно несколько МБ и 4 МБ * 900 -> 3,6 Го)
Кстати, это то, что так интересно в процедурах Google Go. Вместо того, чтобы создавать как можно больше потоков, среда выполнения Go адаптирует количество потоков к числу доступных ядер и вручную мультиплексирует подпрограммы в этих физических потоках.
Кроме того, подпрограммы являются легковесными (резервируя только 4 КБ каждая), потому что они не используют традиционный стек (исчезновение переполнения стека!), Что означает, что вы можете эффективно охватить несколько тысяч подпрограмм на обычной машине, и это не будет стоить вам дорого.
Если вы хотите поэкспериментировать с крайним параллелизмом:
- Узнайте, как уменьшить пространство стека, выделенное для потока (остерегайтесь переполнения стека)
- переключитесь на Go или найдите другой язык, реализующий подпрограммы