Когда следует использовать многопоточность с asio? - PullRequest
0 голосов
/ 07 февраля 2019

Я пишу сетевую библиотеку, которая использует Boost asio, и меня не устраивает, использовать ли мне отдельный поток для запуска io_service или нет.

В настоящее время у меня есть класс, охватывающий всю работу asio.Он имеет один io_service, один сокет и т. Д. И использует методы async_read и async_write для связи с удаленным сервером.Этот класс предоставляет методы чтения и записи, чтобы пользователи могли взаимодействовать с удаленным сервером.

Затем этот класс вызывается другими классами, которые используют его методы чтения / записи для отправки и получения данных на удаленный сервер.В некоторых случаях существуют цепные вызовы для чтения / записи данных с сервера, пока не будет вызван окончательный обратный вызов, предоставленный пользователем, для передачи окончательного результата вычисления.

Я сейчас пытаюсь реализовать пул соединенийи мне интересно, нужен ли мне пул потоков: все операции чтения и записи на удаленный сервер используют асинхронные методы, ни одна обработка после чтения не включает блокировку вызовов до окончательного обратного вызова, предоставленного пользователем.Разве не должно быть хорошо, если одновременно запускается ряд объектов соединения без отдельного пула потоков?

1 Ответ

0 голосов
/ 07 февраля 2019

Если у вас есть только один поток, то когда вы получаете данные и обрабатываете их, вы блокируете любые другие вызовы.Конечно, если единственное, что вы делаете в async_read или async_write, это запускаете следующий асинхронный вызов, то потоки io_service всегда ожидают поступления новых данных и заполняют соответствующее соединение, лежащее в основе структур данных,Нет проблем только с одним потоком.

Но у вас, вероятно, есть какая-то обработка, которая взаимодействует с данными чтения / записи, и эту часть вы можете распараллелить с пулом потоков.Итак, вопрос в том, насколько велика доля времени, затрачиваемого на эту обработку.Является ли это узким местом (задержка и пропускная способность) сервера?

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

Итак, реальный вопрос: где узкое место?

...