Я пишу UDP-серверы, которые должны обрабатывать большое количество клиентов.
Протоколы очень просты - один UDP-пакет приходит и декодируется.Это может потребовать небольшой пакет подтверждения.Результаты обычно хранятся в базе данных.
В настоящее время я использую однопоточный UDP-сервер.Он ожидает данные с блокирующим вызовом приема, выполняет довольно быструю обработку данных, а затем помещает их в очередь, чтобы медленная работа с БД могла выполняться другим процессом в фоновом режиме.
Я мог бы использовать асинхронные вызовы UDP (BeginReceieve, EndReceive), но мне интересно, получу ли я что-нибудь с точки зрения производительности?
Многие люди говорят: «Если вы хотите масштабируемости, вам нужно использоватьасинхронные вызовы ".Вроде бы получена мудрость.Я использовал Twisted ранее, поэтому я не боюсь асинхронного проектирования.
Я понимаю, почему с TCP или даже с некоторыми более сложными протоколами UDP асинхронность хороша.Это помогает избежать одного потока на соединение в TCP-серверах.Но мой протокол на самом деле не требует ожидания, за исключением случаев, когда нечего делать, потому что данные не поступают.
Насколько я понимаю, асинхронные вызовы либо завершатся синхронно, если не требуется блокировка, либо начнутфоновый поток из пула потоков, который будет ждать данных и вызывать ваш обратный вызов, когда некоторые из них будут присутствовать, или когда отправка завершена, или когда будет выполнена какая-либо операция, которую вы выполняли.
Я думаю, что мог бы «случайно» получитьнемного потому, что когда требуется блокирующий прием, результирующее довольно быстрое декодирование будет выполняться в рабочем потоке, а не в основном потоке.Тем не менее, насколько я могу судить, прием будет блокироваться только тогда, когда нет большого количества данных для обработки, т.е. когда такой минимальный выигрыш будет наименее полезным.Кроме того, то же самое усиление можно было бы достичь без асинхронности, если бы оно того стоило.
Итак, мой основной поток выполняет одну из 4 вещей - блокирует ожидание данных, получение данных, обработку данных или отправку данных.Я думаю, что единственным другим битом, который асинхронизация может удалить из основного потока, является время, необходимое для фактического получения или отправки пакета, но я не знаю, насколько быстро они завершатся - например, если UDP-запросы помещаются в очередь драйвером, или еслиНа самом деле блокирующий вызов ожидает, пока данные не будут переданы.
Может кто-нибудь сказать мне, действительно ли я выиграю от использования асинхронных вызовов здесь, и если да, то можете ли вы точно объяснить, почему?
Спасибо!