Как стать автором
Обновить

Комментарии 11

Что именно означает однопоточный, если я верно помню чтобы запустить второй поток в других яп и работать с ним все равно нужно применять костыли в виде блокировок.
В js тоже можно запустить другие потоки прямо из контекста этого, значит что не такой уж он однопоточный выходит, и по сути разница только в том насколько сложно работать с другими потоками придется программисту.
Нет, не обязательно блокировки использовать. Можно работать с разными наборами данных. Есть атомарные операции.
То есть бывает такое что переменная непосредственно доступна в разных потоках? это вроде как на уровне операционной системы нереально и придумывают, что то типа редиса тока внутри программы.
Что такое переменная? Это указатель на память, будь то стек или куча. Вся память процесса доступна каждому потоку, ОС создаёт виртуальную память в рамках процесса. Очень опасно пользоваться стековыми переменными (типы по значению) в других потоках, но и такое бывает.
В JavaScript нет потоков (если не рассматривать последний Node.js). Весь код, хоть он и асинхронный, обрабатывается в одном потоке (см. Event loop). То есть в один момент времени выполняется только одна инструкция, хотя может казаться что они выполняются параллельно. В других ЯП, в которых реализована нормальная многопоточность, в один момент времени могут выполняться сразу несколько инструкций (в разных потоках). И как раз для организации доступа к разделяемой памяти между потоками и применяются блокировки.

Например, если нужно сделать некоторые математические расчеты в несколько потоков, то на JavaScript они будут выполняться, в действительности, последовательно, а на Java, например, будут выполняться параллельно (если правильно реализовать).
Стоит упомянуть, что всё-таки есть способ запустить код в настоящем отдельном потоке в браузере — Web Workers. Да, с ограничениями и сложностями с обменом данными, но тем не менее часть тяжелых вычислений можно туда перенести, разгрузив код отрисовки интерфейса, уменьшив лаги.

Это верно. Но для тех, кто работал с обычними небезопасными потоками яваскриптовые воркеры выглядят точно так же, как запуск дочернего процесса и далее беседа с ним через сокет / пайп.


Взять и пошерить память нельзя до сих пор даже в wasm, хотя казалось бы, почему нет. Видимо, спека даёт какие-то атомарные гарантии, как ява :(

Опечатки:
  • И так, → Итак,
  • Когда встречается вызов функции first() он так же… → Когда встречается вызов функции first(), он также...
  • понятие окружения в котором код→ понятие окружения, в котором код
  • Таким образом все задачи из очереди → Таким образом, все задачи из очереди
  • И так, мы изучил как работает асинхронный JavaScript и другие понятия, такие как стек вызовов, цикл обработки событий, очередь сообщений/очередь задач и очередь микротасков, которые вместе представляют собой среду выполнения JavaScript. → Итак, мы изучили, как работает асинхронный JavaScript и понятия: стека вызовов, цикла обработки событий, очереди сообщений/очереди задач и очереди микротасков, которые составляют среду выполнения JavaScript.
  • очередь микростасков → очередь микротасков
  • Как вы можете видеть “промис” выполнился раньше → Как вы можете видеть, “промис” выполнился раньше
  • считает задачи из очереди микротасков важнее, чем задачи из очереди сообщений/очереди задач → считает задачи из очереди микротасков важнее задач из очереди сообщений/очереди задач ИЛИ считает задачи из очереди микротасков более важными, чем задачи из очереди сообщений/очереди задач
Огромное вам спасибо!
Спасибо за перевод понятной и ёмкой статьи!
Рад, что статья помогает людям :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории