C# async / await в бэкэнд-сервисе / веб-сервисе полезны? - PullRequest
0 голосов
/ 08 апреля 2020

Полезно ли async / await в сценарии бэкэнда / веб-сервиса?

Учитывая случай, есть только один поток для всех запросов / работы. Если этот поток ожидает задачи, он не блокируется, но у него также нет никакой другой работы, поэтому он просто работает вхолостую. (Он не может принять другой запрос, потому что текущее выполнение ожидает решения задачи).

Учитывая случай, есть один поток на запрос / «рабочий элемент». Поток по-прежнему бездействует, потому что другой запрос обрабатывается другим потоком.

Единственный случай, который я могу себе представить, - это выполнение двух async операций одновременно, это как чтение файла и отправка http-запроса. Но это звучит как редкий случай. Следует сначала прочитать файл, а затем опубликовать содержимое, а не публиковать то, что я даже не читал.

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Учитывая случай, есть один поток на запрос / «рабочий элемент». Поток по-прежнему бездействует, потому что другой запрос обрабатывается другим потоком.

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

1 голос
/ 08 апреля 2020

Трудно прочитать ваш вопрос, не чувствуя, что вы неправильно поняли, как работают веб-серверы и как работают async/await и темы. Чтобы упростить задачу, просто подумайте об этом так: async/await почти всегда полезно использовать при запросе внешнего ресурса (например, базы данных, веб-службы / API, системного файла и т. Д. c). Если вы следуете этому простому правилу, вам не нужно слишком глубоко думать о каждой ситуации.

Однако, когда вы читаете и изучаете больше по этим предметам и получаете хороший опыт, глубокое мышление становится необходимым в каждом случае, потому что всегда есть исключения из любого правила, поэтому существуют сценарии ios, в которых накладные расходы на использование потоков async/await & могут превзойти их преимущества. Например, Microsoft решила не использовать его для ведения журнала в ASP. Net Core, и в исходном коде даже есть комментарий об этом.

В вашем случае веб-сервер использует гораздо больше потоков что вы, кажется, думаете, и по гораздо большим причинам, чем вы думаете. Также, когда поток не работает в ожидании чего-либо, он не может делать ничего другого. async/await делает то, что они ie не извлекают поток из текущей ожидаемой задачи, поэтому поток может go вернуться в пул и сделать что-то еще. Когда ожидаемая задача завершена, поток (может быть другим потоком) извлекается из пула, чтобы продолжить работу. Кажется, вы в какой-то степени понимаете это, но, возможно, вы просто не знаете, что еще может делать поток в веб-сервере. Поверьте мне, есть много дел.

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

0 голосов
/ 08 апреля 2020

Учитывая случай, есть только один поток для всех запросов / работы.

Я призываю вас сказать, что это очень заумный случай. Даже до многоядерных серверов, потому что стандартно, asp. net использовал 50+ потоков на ядро.

Если этот поток ожидает задачи, он не блокируется, но у него также нет никакой другой работы. так что это просто бездельничает.

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

...