Ну, это зависит от того, как вы определяете параллелизм.
В программном обеспечении на стороне сервера параллелизм и параллелизм часто рассматриваются как разные понятия. На сервере поддержка одновременных операций ввода-вывода означает, что сервер может обслуживать несколько клиентов, выполняя несколько потоков, соответствующих этим клиентам только с одним вычислительным модулем. В этом контексте параллелизм будет означать, что сервер способен выполнять несколько вещей одновременно (с несколькими вычислительными блоками), что отличается.
Например, бармен может присматривать за несколькими клиентами, в то время как он может готовить только один напиток за раз. Таким образом, он может обеспечить параллелизм без параллелизма.
Этот вопрос обсуждался здесь: в
чем разница между параллелизмом и параллелизмом?
Смотрите также эту презентацию от Роба Пайка.
Однопоточная программа может определенно обеспечить параллелизм на уровне ввода / вывода, используя механизм мультиплексирования ввода / вывода и цикл обработки событий (что и делает Redis).
Параллелизм имеет свою стоимость: благодаря наличию нескольких сокетов / нескольких ядер на современном оборудовании синхронизация между потоками чрезвычайно дорога. С другой стороны, узким местом эффективного механизма хранения, такого как Redis, очень часто является сеть, задолго до ЦП. Поэтому изолированные циклы событий (которые не требуют синхронизации) рассматриваются как хороший проект для создания эффективных, масштабируемых серверов.
Тот факт, что операции Redis являются атомарными, является просто следствием однопоточного цикла событий. Интересным моментом является то, что атомарность предоставляется без дополнительной оплаты (не требует синхронизации). Пользователь может использовать его для реализации оптимистической блокировки и других шаблонов, не оплачивая затраты на синхронизацию.
ОК, Redis является однопоточным на уровне пользователя, OTOH, все асинхронные операции ввода-вывода поддерживаются пулами потоков ядра и / или драйверами двухуровневого уровня.
В некоторых случаях « одновременный » включает в себя распространение сетевых событий на конечные автоматы сокетов. Он однопоточный, работает на одном ядре (на уровне пользователя), поэтому я бы не назвал это параллельным. Другие отличаются ..
« масштабирование до бесконечности с точки зрения параллелизма ввода / вывода » - это просто экономия с правдой. Они могут получить больше веры, если скажут, что «могут масштабироваться лучше, чем один поток на клиента, при условии, что клиенты не требуют много», хотя тогда они могут чувствовать себя вынужденными добавить «сдувается при большой нагрузке другими асинхронными решениями». которые используют все ядра на уровне пользователя ».
источник