Python - Ошибка соединения при отправке большого количества запросов [дубликат]

Ваш код разбит на две полностью отдельные части, серверную сторону и клиентскую сторону .

                    |
               ---------->
              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-запрос на сервер. Это может произойти с использованием одного из трех возможных способов:

  1. Ссылка, которая заставляет браузер загружать новую страницу.
  2. Подача формы, которая передает данные на сервер и загружает новую страницу.
  3. Запрос AJAX , который является техникой Javascript, чтобы сделать обычный HTTP-запрос на сервер (например, 1. и 2. будет), но без оставляя текущую страницу.

Вот более подробный изложение этого метода

Вы также можете использовать JavaScript, чтобы браузер открыл новую страницу с помощью window.location или отправить форму, подражая возможностям 1 и 2.

28
задан ShuggyCoUk 28 January 2009 в 14:06
поделиться

8 ответов

Сначала я бы посоветовал прочитать это: http://blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx

, затем http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx

Подводя итог, ограничение обычно представляет собой пространство стека (которое должно быть смежным блоки), и поскольку каждая нить потребляет это рассеянное, вы быстро исчерпываете смежные блоки. На 64-битных машинах и операционных системах это гораздо менее проблематично.

Стратегии смягчения существуют, но будут только заходить (и полагаться на то, что вы не используете много стека для потока)

В качестве приблизительного руководства:

  • создание десятков почти наверняка будет работать
  • . Вероятно, сотни на текущем сервере и настольном оборудовании, но рискованные
  • тысячи будут почти конечно, не удастся.

Вам, вероятно, не нужно будет создавать больше десяти (и если вам действительно нужно, чтобы вы знали эту информацию уже)

32
ответ дан ShuggyCoUk 26 August 2018 в 12:23
поделиться
  • 1
    Также необходимо создать их все рано и объединить их для последующего использования, когда память не фрагментирована. – Marco van de Voort 24 August 2011 в 08:38

Прочитайте записи блога Raymond Chen, на которые указывает ответ ShuggyCoUk .

Но обратите особое внимание на этот бит:

реальный вопрос, который возникает каждый раз, когда кто-то спрашивает: «Какое максимальное количество потоков может создать процесс?» «Почему вы создаете так много потоков, что это даже становится проблемой?»

Модель «один поток для каждого клиента» хорошо известна, что она не масштабируется за пределами дюжины клиентов или около того. Если вы собираетесь обрабатывать больше, чем многие клиенты одновременно, вы должны перейти к модели, где вместо выделения потока клиенту вместо этого выделяете объект. (Когда-нибудь я буду размышлять о двойственности между потоками и объектами.) Windows предоставляет порты завершения ввода-вывода и пул потоков, которые помогут вам преобразовать из нитевидной модели в модель на основе рабочего элемента.

1
ответ дан Community 26 August 2018 в 12:23
поделиться

Насколько я понимаю всю модель потоковой передачи, она не должна сильно меняться после Win2K.

Нет реального предела потоков как такового, но больше предела стеков стеков процессов. Подробные сведения об этом см. В подробном объяснении пределов резьбы от Raymond Chen.

1
ответ дан Kosi2801 26 August 2018 в 12:23
поделиться
  • 1
    Бинго! «Но реальный вопрос, который возникает каждый раз, когда кто-то спрашивает», «Каково максимальное количество потоков, которые может создать процесс?» & quot; «Почему вы создаете столько потоков, что это даже становится проблемой?» & quot; – TheSoftwareJedi 27 January 2009 в 01:27

Если вы застряли в существующем дизайне, который использует большое количество потоков и нуждается в масштабировании, вы также можете рассмотреть волокна:

http://msdn.microsoft.com/ru -us / library / ms682661% 28v = vs.85% 29.aspx

Это может сэкономить вам полную редизайн.

Indy рассмотрел его для Indy 10, но это никогда не происходило, потому что приключения в .NET потребляли большую часть времени.

1
ответ дан Marco van de Voort 26 August 2018 в 12:23
поделиться
  • 1
    Вторая ссылка ShuggyCoUk на OldNewThing говорит о волокнах: Обратите внимание, что волокна не очень помогают здесь, потому что у волокна есть стек, и именно адресное пространство, требуемое стеком, является ограничивающим фактором почти все время . – foraidt 3 April 2012 в 13:32
  • 2
    Ссылка ShuggyCoUk означает, что это не окончательное решение. Я вижу, что это больше, чем дополнительное масштабирование, где полные потоки не будут идти. Но, как сказано, знание связано с датированными дискуссиями в то время, когда 64-битный означает альфа. – Marco van de Voort 1 June 2012 в 23:32

Лучший ответ, который я слышал при задании таких вопросов:

Это не имеет значения, и если вы обнаружите, что это имеет значение, вам нужно переосмыслить, что вы делаете так что это не имеет значения.

22
ответ дан Rex M 26 August 2018 в 12:23
поделиться
  • 1
    Браво, потоки становятся самопровозглашаемыми (и неэффективными), когда вокруг него гибнут сотни маленьких педерастов. Используйте пул потоков, и вам не придется беспокоиться. – paxdiablo 27 January 2009 в 01:29
  • 2
    +1 для комментария. Сделал мой день. И когда дело доходит до потоковой передачи, это, безусловно, верно. – Kornelije Petak 7 August 2011 в 13:22
  • 3
    Я собираюсь запустить Windows на Knights Landing. Так что теперь это очень важно с потоками 256-288 – user1649948 20 June 2016 в 22:17

Вопрос кажется очень старым, но хотел добавить, что может быть полезно и другим:

Эта статья касается: Нажатие ограничений Windows: Процессы и потоки

http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx

0
ответ дан Saurabh D 26 August 2018 в 12:23
поделиться

Размер стека по умолчанию - 1 МБ, а адресное пространство пользовательского режима, назначенное процессу Windows под 32-разрядной ОС Windows, составляет около 2 ГБ. которые позволяют примерно 2000 потоков на процесс (2000 * 1 МБ = 2 ГБ). для 64 бит, практически, такой проблемы нет.

0
ответ дан Teoman shipahi 26 August 2018 в 12:23
поделиться

Обратите внимание, что вам следует внимательно изучить ваш дизайн, если вы обеспокоены ударом этого предела !!!!!!!!

Ответ на ваш «Более важный вопрос» о том, что происходит, это OutOfMemoryException.

Не совсем прямой ответ, но вот некоторый код, чтобы узнать предел. Тем не менее, он может быть доступным для памяти. Было бы интересно увидеть другие результаты OS / cpu / mem.

Не стесняйтесь редактировать и добавлять свой компьютер в:

  • Windows 7, VS2008, двухъядерный, 2gb mem : 1,465, затем сбой OutOfMemoryException
        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());
        }
    
13
ответ дан TheSoftwareJedi 26 August 2018 в 12:23
поделиться
  • 1
    +1 на «если вам нужно спросить, то вы делаете что-то не так». настроения! – Greg Beech 27 January 2009 в 01:28
  • 2
    Зачем вам это сообщество? Это хороший ответ (I + 1ed you); вы должны получить кредит на это. – John Rudy 27 January 2009 в 02:11
  • 3
    Сообщество wiki, потому что меня не интересует репутация, и это облегчает для других возможность добавлять свои результаты. – TheSoftwareJedi 27 January 2009 в 02:21
Другие вопросы по тегам:

Похожие вопросы: