Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937

Что будет если на сервер придет одновременно два запроса?

29.06.2020, 10:10. Показов 7730. Ответов 22

Студворк — интернет-сервис помощи студентам
Доброго дня!) Вопрос теоретический, но все же. Смотрите например есть форма куда забиваются данные, по нажатию кнопки эти данные отправляются на сервер, на сервере на основе этих данных формируется отчет в word (например отчет формируется в течении 5 минут) и возвращается обратно пользователю.

Что будет если в то время пока формируется отчет, с другого компа отправят еще запрос (или 2 запроса)?

Что в этом случае будет делать сервер, он эти запросы в очередь поставит?

Добавлено через 3 минуты
Т.е. я к чему: если например с интервалом в 1 секунду (чисто гипотетически) придет 10 запросов из формы, то если принять что на один отчет сервер тратит 5 минут, последний пользователь который отправил запрос получит ответ через 10*5=50 минут?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.06.2020, 10:10
Ответы с готовыми решениями:

Что будет, если два разных потока попытаются отправить одновременно одному клиенту два разных пакета
Здравствуйте! Имеется вот такой незамысловатый метод отправки пакетов на сокет клиента public static void...

Два запроса на сервер одновременно
Друзья помогите советом, рекомендацией. Есть site1. На нем пользователь проходит процесс голосования. данные из формы попадают путем...

Что будет, если несколько пользователей одновременно будут производить обновление БД...
мне нужно апдейтнуть в таблице 5000 записей, делаю так $upd=array(); $r=$mysqli->query("SELECT `img`,`w`,`h` FROM `photo` WHERE...

22
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
01.07.2020, 19:55
Я не знаток веб-серверов.
Если я не ошибаюсь, то Nignix - событийный, основанный на round-robin.
А Apache форкнет поток. Боюсь тут ввести в заблуждение.

Т.е. если я не ошибаюсь, то Апач создаст полностью новый поток. Запустит в нем Джангу, проделает всю бизнес-логику.
Тут прилетает новый запрос, новый поток, новая джанга. Возможно, есть настройки у Апача, чтобы он работал событийно.

В общем, так до потери сознания сервером. Т.е. можно его положить - до 500-й ошибки.

Nginx форкать ничего не будет, новую Джангу создавать не будет. Он существующей Джанге даст во вьюху новый запрос. А когда Джанга отработает, поймает ее ответ. И вернет юзеру.

Т.е. положить сервак тоже можно - но он должен протянуть на Nginx чуть дольше.


В общем, мне кажется, что:
1. Архитектура классического веб-приложения тут не очень подходит. Потому что будет открытое соединение по http держаться 5 минут.
Это плохо.
2. Надо бы такую длительную задачу ставить в очередь на серваке. Будут ресурсы у сервака - он сделает задачу и отдаст юзеру.
3. Юзеру надо сообщить о том, что задача в работе. Включить спиннер.
4. Периодически опрашивать сервак Аяксом: готов ли отчет.
5. Когда отчет готов, забрать его аяксом и дать юзеру.

Но я вот в этом всем очень плаваю. И если кто из гуру ответит на поставленный вопрос, было бы просто здорово.
Так что присоединяюсь к вопросу.

Добавлено через 6 минут
Цитата Сообщение от Михалыч Посмотреть сообщение
Т.е. я к чему: если например с интервалом в 1 секунду (чисто гипотетически) придет 10 запросов из формы, то если принять что на один отчет сервер тратит 5 минут, последний пользователь который отправил запрос получит ответ через 10*5=50 минут?
Не через 50, конечно. Параллельные вычисления.
Минут за 5+ . Плюс - потому что точно не за 5 минут. Даже если будет 16 ядер на 10 задач. Закон Амдала не позволит закончить в один срок.
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.07.2020, 15:10
Смотря как развёрнуто приложение. Если более-менее стандартная связка nginx+uwsgi, то второй запрос придёт на свободный воркер и будет выполнен параллельно. Если всего воркеров 4, то максимум будет обработано 4 запроса параллельно. nginx будет остальные запросы придерживать, пока не освободится воркер. Скорее всего клиенту отдастся ошибка 502 по истечении таймаута (около минуты).
3
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
14.07.2020, 15:57
А worker в nginx - это же поток. Т.е. будет все же новый поток, в нем новая Django. Так?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.07.2020, 16:10
Нет, речь шла про worker uwsgi. Их создаётся фиксированное количество. nginx вообще не умеет запускать никакой код и только проксирует запросы.

Добавлено через 1 минуту
Цитата Сообщение от Kifsif Посмотреть сообщение
А worker в nginx - это же поток.
Нет, процесс:
Bash
1
2
3
4
5
6
$ ps aux | grep nginx
root      1020  0.0  0.0 141116   420 ?        Ss   июл11   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data  1021  0.0  0.0 144468  1440 ?        S    июл11   0:00 nginx: worker process
www-data  1022  0.0  0.0 143836   104 ?        S    июл11   0:00 nginx: worker process
www-data  1023  0.0  0.0 143836   104 ?        S    июл11   0:00 nginx: worker process
www-data  1024  0.0  0.0 144136  1428 ?        S    июл11   0:00 nginx: worker process
2
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
14.07.2020, 16:14
Я запутался worker nginx - это же отдельный поток. Значит в отдельном потоке отработает worker uwsgi. В общем, я потерял нить абсолютно.

Нельзя ли расписать всю схему полностью от запуска веб-сервера через прилет первого запроса и последующих запросов до отдачи ответа на каждый запрос.

При этом подчеркнуть разницу Apache и Nginx.
И особо отметить момент: когда запускается новая Django.

Совсем не запускать новую Django нельзя. Когда-то же она должна была создаться хотя бы одна.
А вот будет ли она создаваться заново на каждый запрос - этот вопрос интересен.
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.07.2020, 16:26
Цитата Сообщение от Kifsif Посмотреть сообщение
Значит в отдельном потоке отработает worker uwsgi.
Нет, не работает там.

Будет многабукв.

Раз: есть демон nginx'а - он слушает порты и принимает запросы. Он намного проще апача: раздаёт статику (файлы) и не выполняет никакой код. Проксирует запросы дальше. Например, на unix-сокет. Да, у него есть воркеры, которые позволяют утилизировать все ресурсы системы.

Два: есть демон uwsgi - он может выполнять код на различных языках. В том числе питон. Он слушает unix-сокет (со своим бинарным протоколом) и запускает воркеры, внутри которых работает копия wsgi-приложения. Джанго как раз для развёртывания предлагает wsgi-интерфейс.

Таким образом запущенное приложение выглядит так:
* база данных (может быть на другом сервере)
* uwsgi с воркерами
* nginx

Запрос приходит на nginx - он находит нужный location и передаёт запрос uwsgi. uwsgi находит свой свободный воркер и передаёт запрос в приложение. Если воркер упал - он перезапускается.
3
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
14.07.2020, 16:28
Так, а в воркере uwsgi что происходит? Каждый раз запуск джанги с последующим ее закрытием?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.07.2020, 16:35
Нет, один раз запустился - и работает. Обработал запрос, отдал ответ - ждёт нового запроса.
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
14.07.2020, 21:11
Рыжий Лис, отдельный воркер uwsgi, gunicorn etc = отдельный инстанс приложения?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
15.07.2020, 05:00
Да.
1
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
15.07.2020, 09:03
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Да.
Количество воркеров uwsgi ограничено, если я не ошибаюсь. Что-то типа один воркер на виртуальное ядро.

Т.е.:

1. Летит запрос от посетителя сайта.
2. Сработал nginx. Nginx событийный. Он взял и пробросил, допустим, запрос, на gunicorn. И дальше занимается своими делами - когда будет надо, ему дадут ответ, либо таймаут истечет.
3. Gunicorn запускает свой воркер уже в отдельном потоке. В нем новая Django.
4. Django отработала, вернула ответ.
5. Gunicorn получил ответ, завершил работу потока. Вернул ответ серверу nginx.
6. Сервер nginx обнаружил событие ответа на запрос и вернул результат юзеру.

Так получается?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
15.07.2020, 09:12
Цитата Сообщение от Kifsif Посмотреть сообщение
Что-то типа один воркер на виртуальное ядро.
Типа того. Это прописывается в конфиге:
Code
1
2
3
[uwsgi]
processes = %k
threads = 2
Переменная %k - количество (логических) ядер процессора на машине. https://www.cyberforum.ru/blog... g5330.html

Цитата Сообщение от Kifsif Посмотреть сообщение
3. Gunicorn запускает свой воркер уже в отдельном потоке. В нем новая Django.
Цитата Сообщение от Kifsif Посмотреть сообщение
5. Gunicorn получил ответ, завершил работу потока. Вернул ответ серверу nginx.
Нет, воркер запущен заранее. Вот пример из мана:
Bash
1
2
3
4
5
6
7
  $ gunicorn -w 4 myapp:app
  [2014-09-10 10:22:28 +0000] [30869] [INFO] Listening at: http://127.0.0.1:8000 (30869)
  [2014-09-10 10:22:28 +0000] [30869] [INFO] Using worker: sync
  [2014-09-10 10:22:28 +0000] [30874] [INFO] Booting worker with pid: 30874
  [2014-09-10 10:22:28 +0000] [30875] [INFO] Booting worker with pid: 30875
  [2014-09-10 10:22:28 +0000] [30876] [INFO] Booting worker with pid: 30876
  [2014-09-10 10:22:28 +0000] [30877] [INFO] Booting worker with pid: 30877
Получается, что между запросами в коде сохраняется состояние всех глобальных переменных (приложение же не завершалось). Только есть маленький подвох: следующий запрос может прийти на другой воркер, где (сюрприз!) другое состояние глобальных переменных.

Добавлено через 1 минуту
https://docs.gunicorn.org/en/s... deployment
2
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
15.07.2020, 13:23
Рыжий Лис,
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Да.
Если предположить, что запущено 4 инстанса приложения.
Допустим, есть модель А. Приходит запрос на первый инстанс и создаётся экземпляр этой модели (запись в бд, тот же постгрес, к примеру).
На второй инстанс приложения приходит запрос на получение этой записи. Я верно понимаю, что запись будет доступна (так как каждый инстанс обращается к бд, когда есть определённый запрос, и на момент запроса на второй инстанс приложения запись в бд уже есть)?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
15.07.2020, 13:32
Да, всё верно. Если в базу вставили запись (INSERT или обновили UPDATE, или удалили DELETE) и при этом сделали коммит (COMMIT, в джанге по умолчанию autocommit включён), то при следующих запросах (в том числе и из других воркеров) к базе будет отдаваться изменённая версия данных.

А вот если коммит не делать (я периодически об это обжигаюсь), то всем остальным клиента будет отдаваться старая версия данных, и только ты в текущей сессии будешь видеть новые (пока не закоммитишь или не откатишь изменения). Впрочем, для джанги такие случаи редки (хотя она тоже умеет в транзакции).
1
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
15.07.2020, 13:39
Рыжий Лис, теперь понятно, об что я иногда бился в фласке с алхимией
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
15.07.2020, 13:42
Разве там autocommit не включён? Расскажи, что хоть за проблема была.
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
15.07.2020, 13:48
Рыжий Лис, погоди, ты же об этом?
Python
1
2
session.add(object)
session.commit()
https://docs.sqlalchemy.org/en... ssionmaker
autocommit в False выставлен по дефолту
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Расскажи, что хоть за проблема была.
Было, что приходило два запроса практически одновременно. Один - на insert, второй - на select. Во время второго запроса не было видно записи добавленной первым запросом..
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
15.07.2020, 13:52
Видимо, да, про это.

Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
Во время второго запроса не было видно записи добавленной первым запросом..
Скорее всего insert ещё не закоммитили. Либо база успела выполнить select быстрее, чем закоммитить изменения (операция записи занимает больше времени, и чтобы не лочить все запросы чтения, отдаётся предыдущая версия).
1
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
15.07.2020, 14:42
Рыжий Лис, вот и я теперь понял. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.07.2020, 14:42
Помогаю со студенческими работами здесь

Что будет, если к базе данных, расположенной на сервере, одновременно обратятся 2 компьютера
Что будет, если к базе данных, расположенной на сервере одновременно обратятся 2 компьютера и попытаются добавить строчку в одну и ту же...

Что будет, если не установить параметр запроса?
Всем привет! Такой вот наверное простой вопрос... Если я в запросе указала отбор по параметру Проект, но не установила этот параметр...

Что будет результатом выполнения запроса e(5,[1,2,5,8,1,5,7],X), если ЛП выглядит следующим образом
1. Что будет результатом выполнения запроса e(5,,X), Если ЛП выглядит следующим образом: e(x,,Xs). e(x,,):-X<>Y,e(X,Ys1,Ys2). ...

Что будет просисходить в оперативке, если запустить два одинаковых процесса?
У меня возник вопрос: Если запустить два одинаковых процесса (например два браузера) каждый из которых занимает 2 мб, что будет...

Что будет, если поставить две разные Windows на два разных HHD?
Есть основная Windows на основном жестком диске. Появилась потребность поставить вторую Windows на другой пустой жесткий диск. Могут ли...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru