Ваш код разбит на две полностью отдельные части, серверную сторону и клиентскую сторону .
|
---------->
HTTP request
|
+--------------+ | +--------------+
| | | | |
| browser | | | web server |
| (JavaScript) | | | (PHP etc.) |
| | | | |
+--------------+ | +--------------+
|
client side | server side
|
<----------
HTML, CSS, JavaScript
|
Обе стороны общаются через HTTP-запросы и ответы. PHP выполняется на сервере и выводит код HTML и, возможно, JavaScript, который отправляется как ответ клиенту, где интерпретируется HTML, и выполняется JavaScript. Когда PHP завершит вывод ответа, сценарий закончится, и на сервере ничего не произойдет, пока не появится новый HTTP-запрос.
Пример кода выполняется следующим образом:
Шаг 1, PHP выполняет весь код между тегами . В результате получилось следующее:
Вызов file_put_contents
не привел ни к чему, он просто написал «+ foo +» в файл. Вызов привел к выводу «42», который теперь находится в том месте, где этот код использовался.
Этот итоговый код HTML / JavaScript теперь отправляется клиенту, где он получает оценку , Вызов alert
работает, а переменная foo
нигде не используется.
Весь PHP-код выполняется на сервере до того, как клиент даже начнет выполнение какого-либо JavaScript. В ответе JavaScript, с которым может взаимодействовать JavaScript, нет кода PHP.
Чтобы вызвать некоторый код PHP, клиент должен будет отправить новый HTTP-запрос на сервер. Это может произойти с использованием одного из трех возможных способов:
Вот более подробный изложение этого метода
Вы также можете использовать JavaScript, чтобы браузер открыл новую страницу с помощью window.location
или отправить форму, подражая возможностям 1 и 2.
Сначала я бы посоветовал прочитать это: http://blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx
, затем http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx
Подводя итог, ограничение обычно представляет собой пространство стека (которое должно быть смежным блоки), и поскольку каждая нить потребляет это рассеянное, вы быстро исчерпываете смежные блоки. На 64-битных машинах и операционных системах это гораздо менее проблематично.
Стратегии смягчения существуют, но будут только заходить (и полагаться на то, что вы не используете много стека для потока)
В качестве приблизительного руководства:
Вам, вероятно, не нужно будет создавать больше десяти (и если вам действительно нужно, чтобы вы знали эту информацию уже)
Прочитайте записи блога Raymond Chen, на которые указывает ответ ShuggyCoUk .
Но обратите особое внимание на этот бит:
реальный вопрос, который возникает каждый раз, когда кто-то спрашивает: «Какое максимальное количество потоков может создать процесс?» «Почему вы создаете так много потоков, что это даже становится проблемой?»
Модель «один поток для каждого клиента» хорошо известна, что она не масштабируется за пределами дюжины клиентов или около того. Если вы собираетесь обрабатывать больше, чем многие клиенты одновременно, вы должны перейти к модели, где вместо выделения потока клиенту вместо этого выделяете объект. (Когда-нибудь я буду размышлять о двойственности между потоками и объектами.) Windows предоставляет порты завершения ввода-вывода и пул потоков, которые помогут вам преобразовать из нитевидной модели в модель на основе рабочего элемента.
blockquote>
Насколько я понимаю всю модель потоковой передачи, она не должна сильно меняться после Win2K.
Нет реального предела потоков как такового, но больше предела стеков стеков процессов. Подробные сведения об этом см. В подробном объяснении пределов резьбы от Raymond Chen.
Если вы застряли в существующем дизайне, который использует большое количество потоков и нуждается в масштабировании, вы также можете рассмотреть волокна:
http://msdn.microsoft.com/ru -us / library / ms682661% 28v = vs.85% 29.aspx
Это может сэкономить вам полную редизайн.
Indy рассмотрел его для Indy 10, но это никогда не происходило, потому что приключения в .NET потребляли большую часть времени.
Лучший ответ, который я слышал при задании таких вопросов:
Это не имеет значения, и если вы обнаружите, что это имеет значение, вам нужно переосмыслить, что вы делаете так что это не имеет значения.
blockquote>
Вопрос кажется очень старым, но хотел добавить, что может быть полезно и другим:
Эта статья касается: Нажатие ограничений Windows: Процессы и потоки
http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx
Размер стека по умолчанию - 1 МБ, а адресное пространство пользовательского режима, назначенное процессу Windows под 32-разрядной ОС Windows, составляет около 2 ГБ. которые позволяют примерно 2000 потоков на процесс (2000 * 1 МБ = 2 ГБ). для 64 бит, практически, такой проблемы нет.
Обратите внимание, что вам следует внимательно изучить ваш дизайн, если вы обеспокоены ударом этого предела !!!!!!!!
Ответ на ваш «Более важный вопрос» о том, что происходит, это OutOfMemoryException.
Не совсем прямой ответ, но вот некоторый код, чтобы узнать предел. Тем не менее, он может быть доступным для памяти. Было бы интересно увидеть другие результаты OS / cpu / mem.
Не стесняйтесь редактировать и добавлять свой компьютер в:
int i = 0;
try
{
while (true)
{
new Thread(new ThreadStart(() => Thread.Sleep(int.MaxValue))).Start();
i++;
}
}
catch (Exception ex)
{
Console.WriteLine(i);
Console.WriteLine(ex.ToString());
}