Хотя может показаться, что этот вопрос задавали несколько раз, и я уже получил высоко оцененные ответы, я хотел бы предположить, что несколько ответов противоречат друг другу, и я никогда не смогу прийти к полному пониманию внутреннего устройства асинхронного кода. Я полностью понимаю, что это означает продолжение последовательного выполнения кода и выполнение задачи позже, я пытаюсь понять, что позже часть.
Ответ 1 - Предлагает UI / Main
Во-первых, этот вопрос содержал внутри себя следующий тест, предполагающий, что асинхронный код выполняется в потоке Main / Ui и ссылается на статью объясняет, почему нет другого потока для асинхронного кода.
Q: «На мой взгляд, поскольку я в основном занимаюсь разработкой пользовательского интерфейса, asyn c код - это код, который не запускается в пользовательском интерфейсе нить, но в какой-то другой нити ".
A: Это убеждение распространено, но ложно. Не требуется, чтобы асинхронный код выполнялся в каком-либо втором потоке.
Фактически, ответ предполагает, что асинхронное программирование с потоками «неправильно», говоря: «Потоки являются рабочими. Могут происходить асинхронные рабочие процессы. все в одном потоке. Смысл асинхронного рабочего процесса состоит в том, чтобы избежать найма большего количества рабочих, если вы можете этого избежать ».
Ответ 2 - Предлагает UI / Main
Следующий вопрос, который я прочитал, также предполагает, что асинхронный код выполняется в потоке Main / UI, , однако используемое сравнение равно JavaScript, что, как мы все знаем, является однопоточный язык. Например, предположим, что я запускаю этот код,
function wait(ms) {
var start = Date.now(),
now = start;
while (now - start < ms) {
now = Date.now();
}
}
setTimeout(() => {
wait(5000);
}, 3000)
setTimeout
будет вызываться асинхронно, а после 3000ms
обратный вызов будет добавлен к Event Loop
и в конечном итоге будет выполнен. Однако выполнение метода будет выполняться в потоке Main / UI и, таким образом, в результате пользовательский интерфейс будет заморожен для 5000ms
.
Ответ 3 - Предложение нового потока
Этот ответ предполагает, что асинхронный код запускается в новый поток внутри ответа, который он говорит. «Когда вы выполняете что-то асинхронно, вы можете перейти к другой задаче до ее завершения. При этом в контексте компьютеров это означает выполнение процесса или задачи в другом« потоке ».
Ответ 4 - Предложение новой темы
Окончательный ответ предполагает, что асинхронный код основан на потоке, говоря: " В общем случае асинхронный вызов не обязательно создает новый поток. Это один из способов его реализации, другие способы - это уже существующий пул потоков или внешний процесс. Это сильно зависит от языка, объектной модели (если есть) и среды выполнения. Асинхронность просто означает, что вызывающий поток не сидит и не ждет ответа, и при этом асинхронная активность не происходит в вызывающем потоке. «, причем основной точкой является », и при этом асинхронная активность не происходит в вызывающем потоке. thread "
Я не уверен, куда go с этого момента, насколько я понимаю, я думаю, что асинхронный код должен выполняться в другом потоке, чтобы никогда заблокировать пользовательский интерфейс , за исключением JavaScript, я полагаю. Однако даже когда дело доходит до выполнения асинхронного кода на однопоточном языке, я бы подумал, что любой выполняемый обратный вызов функции должен должен быть выполнен до завершения, прежде чем будет запущен другой обратный вызов.
Второй ответ здесь предполагает рисование, когда асинхронный код выполняется в одном потоке, он останавливается и запускает другой асинхронный обратный вызов, переключаться вперед и назад, как поток, пока они не закончатся. Для меня это не означает, что Смысл в том, что с асинхронным кодом они обычно включают обратный вызов для предотвращения любого вида состояния гонки, предположим, что B требовал, чтобы A сначала выполнялся до завершения, B будет обратным вызовом внутри A. Обратные вызовы A и B не будут «работать вместе» и переключаться между собой.