2016-06-21 6 views
0

Я пытаюсь определить, что произойдет, когда мои методы Web API будут вызываться одновременно двумя клиентами. Для того, чтобы сделать это я генерация два запросов асинхронных в Python:ASP.NET Web API 2 Обработка асинхронных запросов

rs = (grequests.post(url, data = json), grequests.post(url, data = json)) 
grequests.map(rs) 

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

Есть ли способ убедиться, что веб-API обрабатывает запросы не одновременно?

+1

Заблокируйте свой общий ресурс. –

+0

@BrianDriscoll См. Мое редактирование. Я убедился, что ресурс заблокирован с очередью, однако я все еще получаю помехи между запросами. –

+3

Независимо от того, выполняется ли одновременное выполнение запросов веб-API, как определяется ваш API, он не определяется в коде. Если вы работаете в IIS, ваши запросы будут обрабатываться одновременно отдельными рабочими процессами. Не зная больше о вашем API, я бы сказал, что у вас проблема дизайна, а не проблема с реализацией. –

ответ

3

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

Я считаю, что у вас есть непонимание того, что такое «неасинхронный» метод Web API. Когда метод Web API является асинхронным, это означает, что он будет делиться потоком пула приложений, пока он находится в состоянии ожидания. Это имеет то преимущество, что другие запросы не требуют инициализации нового потока (что несколько дорого). Это также помогает свести к минимуму количество параллельных потоков, которые, в свою очередь, сводят к минимуму количество потоков, которые пул приложений должен стоять в очереди.

Для неасинхронных методов пул приложений IIS инициализирует новый поток для каждого запроса, даже если доступен неактивный поток. Кроме того, он не будет делиться этим потоком с любыми другими запросами.

Таким образом, короткий ответ на ваш вопрос - нет. Невозможно убедиться, что запросы веб-API обрабатываются не одновременно. Комментарий Брайана Дрисколла правильный. Во время запроса вам придется заблокировать свои общие ресурсы.

Смежные вопросы