Когда я изучал цикл событий в Node.js, я услышал определение «многопоточности» и я действительно не знаю, что они означают или что они означают. Если бы кто-то мог объяснить это мне, я был бы очень признателен. Прежде всего, спасибо.
Когда я изучал цикл событий в Node.js, я услышал определение «многопоточности» и я действительно не знаю, что они означают или что они означают. Если бы кто-то мог объяснить это мне, я был бы очень признателен. Прежде всего, спасибо.
Прежде чем определить многопоточность , давайте посмотрим, что такое программа.
Программа — это набор данных и функций; Ни больше ни меньше. В большинстве языков доступ к данным осуществляется через переменные.
Переменная, в свою очередь, может быть глобальной (доступ к ней возможен из любой точки программы) или локальной (доступ к ней возможен только из той функции, в которой она была определена).
Поток или поток выполнения можно рассматривать как конкретную точку выполнения программы. В любой момент времени поток может выполнять только определенный оператор кода; С этой конкретной точки мы можем получить доступ ко всем глобальным переменным, но только к локальным переменным функции, в которой мы находимся.
Кроме того, с потоком связана другая дополнительная информация: текущий стек вызовов (информация о вызывающих функциях) вместе с используемыми аргументами.
Однопоточное приложение, такое как Nodejs, имеет только один поток ; В любой момент времени существует только одна точка выполнения.
С другой стороны, многопоточное приложение имеет более одной точки выполнения в данный момент времени. Он по-прежнему имеет один набор глобальных переменных, но одновременно выполняется более одной функции , и каждая точка выполнения имеет свою собственную информацию о вызывающей функции, свой собственный набор аргументов и свой собственный набор локальных переменных.
Если мы запустим многопоточное приложение на машине с более чем 1 ЦП , производительность этого приложения будет выше , чем у однопоточного приложения ; каждый поток может выполняться на одном процессоре, поэтому вы можете выполнять более одной задачи одновременно.
Если у нас есть только 1 ЦП, он распределяет свое время между всеми потоками всех программ, находящихся в процессе выполнения, поэтому мы не получим преимущества от использования нескольких потоков.
Основным недостатком многопоточных приложений является поддержание порядка при доступе к общим ресурсам (таким как глобальные переменные). Сосредоточившись на них, к ним можно получить доступ из всех потоков (в отличие от локальных). Что произойдет, если один поток изменяет глобальную переменную, в то время как другой поток читает или записывает ее? Вы можете проверить классическую проблему ужина философов .
Не существует способа решить, будет ли программа лучше использовать один поток или несколько потоков. Практически ко всем проблемам можно подойти с помощью любого из двух методов. Теоретически с несколькими потоками вы получите лучшую производительность; с резьбой, большей простотой и легкостью работы.
Точно так же плохо спроектированная многопоточная программа может работать медленнее , чем однопоточная. А для некоторых задач (которые можно разбить на блоки работы, не завися друг от друга) использование нескольких потоков обеспечивает гораздо более высокую производительность .
Проще говоря, поток — это основная единица выполнения: когда программа выполняется хотя бы с одним потоком (также называемым «потоком выполнения»), можно сказать, что это «один поток».
Однопоточная программа не выполняет параллельную/параллельную работу. Один из способов одновременного выполнения нескольких задач (параллельно, одновременно) состоит в том, чтобы программа генерировала новые потоки, например, инструкции new Thread() в java создают новые потоки, которые будут выполняться «параллельно», тогда у нас есть «многопоточная» среда, в которой помимо потока выполнения основной программы выполняются запускаемые ею дочерние потоки.
В случае с веб-серверами они традиционно создавали новый поток для обслуживания нового запроса пользователя.Если были тысячи пользовательских запросов, сервер создавал тысячи потоков в ответ на эти запросы.
Управление таким количеством потоков не бесплатно для сервера, у потоков есть свои жизненные циклы, управление памятью, проблемы с синхронизацией и т.д. Кроме того, внутри потока цикл выполнения «блокируется» (инструкция должна завершить выполнение, прежде чем перейти к следующей).
С появлением NodeJS ищется более эффективная модель обслуживания, основанная на цикле событий с одним потоком, чтобы удовлетворить все требования пользователя. Для «неблокирующего» выполнения «дорогие» операции, такие как доступ к вводу/выводу, регистрируются вместе с функцией обратного вызова, которую сервер должен вызвать после завершения операции ввода/вывода.
Благодаря этой стратегии в отношении многопоточных веб-серверов достигается по крайней мере две вещи: а) время между операцией ввода-вывода и обратным вызовом используется для того, чтобы цикл обработки событий мог продолжать обслуживать запросы пользователей. б) Имея простой поток, обслуживающий все запросы пользователей, использование ресурсов после установки остается постоянным. (не тратятся ресурсы на создание/уничтожение/синхронизацию потоков)
Это довольно поверхностный ответ, надеюсь, он все равно поможет.
Многопоточное приложение — это приложение, в котором несколько подпрограмм выполняются независимо и одновременно.
В Node.js существует только один поток выполнения JavaScript.
Здесь лучше объясняется, как это работает https://bytearcher.com/articles/why-in-nodejs-lot-of-asynchronous-operations/