Size: a a a

NodeUA - JavaScript and Node.js in Ukraine

2021 October 05

S

Serhii in NodeUA - JavaScript and Node.js in Ukraine
синхронная = блокирующая,
асинхронная - неблокирующая, если правильно вызвать
источник

MS

Max Shane in NodeUA - JavaScript and Node.js in Ukraine
Короче мне остается только самому планировать порядок вызова независимых функций чтобы длительные исполнялись после быстрых, в случае если они все вызываются одновременно?
источник

VK

Vladymyr Krasulya in NodeUA - JavaScript and Node.js in Ukraine
такая проверка мало что даст - нет гарантии что в асинхронной функции не будет блокирующих операций
источник

S

Serhii in NodeUA - JavaScript and Node.js in Ukraine
не знаю. Может, в твоем кейсе как раз твой подход норм.
источник

S

Serhii in NodeUA - JavaScript and Node.js in Ukraine
да, ты прав.
источник

S

Serhii in NodeUA - JavaScript and Node.js in Ukraine
только в случае, если сам функцию и написал)
источник

MS

Max Shane in NodeUA - JavaScript and Node.js in Ukraine
Мой кейс это общение мейн треда с воркерами через подписку на события, и сообщения могут быть разные, команды например, которые вызывают функции в воркере. Соответственно у меня список функций которые могут быть вызваны в случае on('message') в зависимости от сообщения мейнтреда. И мейн тред может одновременно несколько разных команд послать, из этого следует, что я не хочу чтобы долгая операция блокировала более быструю
источник

S

Serhii in NodeUA - JavaScript and Node.js in Ukraine
Мейн тред шлет несколько команд в один воркер или рандомно в разные?
источник

S

Serhii in NodeUA - JavaScript and Node.js in Ukraine
Можешь создать один тред чисто для быстрых функций?
источник

S

Serhii in NodeUA - JavaScript and Node.js in Ukraine
Но опять-таки, я такое не писал, чисто вот рассуждаю.
источник

S

Serhii in NodeUA - JavaScript and Node.js in Ukraine
на гитхабе что-то есть? Я б посмотрел
источник

MS

Max Shane in NodeUA - JavaScript and Node.js in Ukraine
Нет, пока еще в гитхаб ничего не публикую. Да там ниче сложного. Вроде по-моему описанию понятно должно быть) Но я понял, что чтобы сделать так как я хочу, я должен явно указывать порядок вызова функций. Никакой асинхронной магии я не получу приписав async или засунув функцию в промис
источник

S

Serhii in NodeUA - JavaScript and Node.js in Ukraine
да, мне кажется, это не тот случай
источник

VK

Vladymyr Krasulya in NodeUA - JavaScript and Node.js in Ukraine
что тебе нужно понять - у тебя 1 процесс а это значит что в одну единицу времени ты можешь выполнять только одну операцию, асинхронность это просто магия передачи управления из одной функции в другую в красивом синтаксисе
если говорить в терминах то в ноде невытесняющая многозадачность
на пример
function a(){
 const sum = 1 + 2;
 return sum;
}
при вызове a() ничто другое в твоем процессе выполнятся не будет пока функция не завершится
пример с async
asunc function s() {
 const sum = 1 + 2;
 const result = await request(‘url’, sum);
 return result;
}
в этом примере
при вызове await s()
код синхронно дойдет до await request(‘url’, sum)
выполнится функция request (петля все еще заблокирована) и после этого из request() вернется промис и управление будет передано петле , после этого твой процесс свободен до того момента пока результяте request() не вернется из сети
источник

MS

Max Shane in NodeUA - JavaScript and Node.js in Ukraine
Спасибо. Это я понимаю. Просто (с оф. сайт ноды):
В Node.js есть два типа потоков: один Event Loop и k Workers. Event Loop отвечает за обратные вызовы JavaScript и неблокирующий ввод-вывод, а Workers выполняет задачи, соответствующие коду C ++, который выполняет асинхронный запрос, включая блокирование ввода-вывода и работу с интенсивным использованием ЦП. Оба типа потоков работают не более чем с одним действием одновременно.
источник

MS

Max Shane in NodeUA - JavaScript and Node.js in Ukraine
Я просто тогда упорно не понимаю, какие операции все таки блокируют а какие нет.
источник

MS

Max Shane in NodeUA - JavaScript and Node.js in Ukraine
Я уже пару дней писал сюда вопрос по поводу асинхронности, и говорил, что у меня каша в голове. Видимо каша до сих пор. Что-то понял, например про отсутствие вытесняющей многозадачности, но все равно ясности нет.
источник

АП

Алексей Попов... in NodeUA - JavaScript and Node.js in Ukraine
Если речь о функциях стандартных модулей, то блокируют те, у которых есть суффикс Sync
источник

MS

Max Shane in NodeUA - JavaScript and Node.js in Ukraine
Нет, с ними как раз все понятно. Речь о своих функциях. Например функция которая вызывает проход по циклу и функция которая просто эмитает событие. Я думал что блокирующая тут только одна, та которая делает проход по циклу.
источник

VK

Vladymyr Krasulya in NodeUA - JavaScript and Node.js in Ukraine
если коротко не блокируещее все что проихсходит вне твоего процесса
- ожидание ответа из network или локального unix socket
- ожидание ответа от файловой системы
- ожидание асинхронного таймера
по поводу тредов которые выполняют блокирующие операции - это внутренняя кухня петли , просто некоторые операционные системы на пример не умеют делать неблокируюший I/O файловой системы и для этого есть костыль в виде треда который ждет ответа и не блокирует основной поток петли
источник