Я знаю, что есть много случаев, когда лучше всего использовать несколько потоков приложения, но когда лучше всего использовать многопоточное веб-приложение .net?
Многопоточность веб-приложения
Ответ 1
Веб-приложение почти наверняка уже многопоточно связано с хостинговой средой (IIS и т.д.). Если ваша страница связана с CPU (и вы хотите использовать несколько ядер), то, возможно, несколько потоков - плохая идея, так как когда ваша система находится под нагрузкой, вы уже используете их.
Время, которое может помочь, когда вы привязаны к IO; например, у вас есть веб-страница, которая должна разговаривать с 3 внешними веб-службами, разговаривать с базой данных и писать файл (все не связанные). Вы можете делать это параллельно в разных потоках (в идеале используя встроенные операции асинхронного использования, чтобы максимизировать использование порта для завершения), чтобы сократить общее время обработки - все это не слишком сильно влияет на локальный процессор (здесь реальная задержка находится в сети).
Конечно, в таких случаях вам также может быть лучше, просто поставив в очередь работу в веб-приложении и получив отдельную служебную деинструмент и обработать их, но затем вы не можете предоставить немедленный ответ вызывающему абоненту (они, d нужно проверить позже, чтобы проверить завершение и т.д.).
Ответ 2
IMHO вам следует избегать использования многопоточности в веб-приложении.
возможно, многопоточное приложение может повысить производительность в стандартном приложении (с правильным дизайном), но в веб-приложении вам может потребоваться высокая пропускная способность, а не скорость.
но если у вас есть несколько параллельных подключений, возможно, вы можете использовать параллельный поток без ухудшения глобальной производительности.
Ответ 3
Многопоточность - это метод, обеспечивающий единый процесс с большим временем обработки, чтобы он мог работать быстрее. Он имеет больше потоков, поэтому он потребляет больше циклов процессора. (Из нескольких процессоров, если у вас есть.) Для настольного приложения это имеет большой смысл. Но предоставление большего количества циклов ЦП для веб-пользователя отнимало бы те же самые циклы от 99 других пользователей, которые выполняют запросы одновременно! Так технически, это плохо.
Однако веб-приложение может использовать другие службы и процессы, которые используют несколько потоков. Базы данных, например, не будут создавать отдельный поток для каждого пользователя, который подключается к ним. Они ограничивают количество потоков только несколькими, добавляя соединения к пулу соединений для более быстрого использования. Пока существуют доступные или объединенные соединения, пользователь будет иметь доступ к базе данных. Когда в базе данных заканчиваются соединения, пользователю придется ждать.
Таким образом, в основном использование нескольких потоков может быть использовано для веб-приложений, чтобы уменьшить количество активных пользователей в определенный момент! Это позволяет системе обмениваться ресурсами с несколькими пользователями без перегрузки ресурса. Вместо этого пользователям просто придется стоять в очереди до того, как они повернутся.
Это не будет многопоточным в самом веб-приложении, но многопоточность в службе, потребляемой веб-приложением. В этом случае он используется как ограничение, позволяя только активному количеству потоков.
Ответ 4
Чтобы использовать многопоточность, ваше приложение должно выполнять значительную работу, которая может выполняться параллельно. Если это не так, накладные расходы на многопоточность могут значительно превысить преимущества.
В моем опыте большинство веб-приложений состоят из нескольких коротких запущенных методов, поэтому, помимо parallelism, уже предлагаемого средой хостинга, я бы сказал, что редко можно использовать многопоточность внутри отдельных частей сети выражение. Вероятно, есть примеры, когда это принесет пользу, но я предполагаю, что это не очень распространено.
Ответ 5
ASP.NET уже способен генерировать несколько потоков для обработки нескольких запросов параллельно, поэтому для простой обработки запроса редко бывает случай, когда вам потребуется вручную создать другой поток. Однако есть несколько необычных сценариев, с которыми я столкнулся, что гарантировало создание другого потока:
- Если есть какая-то операция, которая может занять некоторое время и может работать параллельно с остальной частью обработки страницы, вы можете создать там вторичный поток. Например, если в результате запроса был создан веб-сервис, который вы должны были опросить, вы можете создать еще один поток в Page_Init и проверить результаты в Page_PreRender (при необходимости ждать). Хотя это все еще вопрос, если это будет выгодно для производительности или нет - нерестование потока не является дешевым, и время между типичным Page_Init и Page_Prerender измеряется в миллисекундах в любом случае. Сохранение пула потоков для этого может быть немного более эффективным, и ASP.NET также имеет нечто, называемое "асинхронными страницами", которое может быть даже лучше подходит для этой потребности.
- Если есть пул ресурсов, которые вы хотите периодически очищать. Например, представьте, что вы используете какую-то странную СУБД, которая поставляется с ограниченными привязками .NET, но поддержка объединения не поддерживается (это был мой случай). В этом случае вы можете сами реализовать пул соединений с БД, и это потребует "чистого потока", который просыпается, скажем, один раз в минуту и проверяет, есть ли соединения, которые долгое время не использовались (и таким образом, можно закрыть).
Еще одна вещь, которую следует иметь в виду при реализации собственных потоков в ASP.NET - ASP.NET любит убивать свои процессы, если они некоторое время неактивны. Таким образом, вы не должны полагаться на свою нить, оставшуюся в живых навсегда. Он может быть расторгнут в любой момент, и вам лучше быть готовым к этому.