вот вызов crypto.createHash('sha256').update('data').digest('hex') и, если да, как вычислить хэш асинхронно?
блокирует. чтобы вычислить хэш асинхронно надо вынести либо вычисление в отдельный воркер, либо написать свой нативный аддон, который будет возвращать промис и не будет блокировать
Понятно, спасибо.
Любая синхронноя операция блокирует event loop
Предлагаю такой вариант new Promise((res) => { res(crypto.createHash('sha256').update('data').digest('hex')) })
Ну так то ты просто обернул синхронный вызов в промис)
так оно.и делается) Вот еще с таймерами, const crypto = require('crypto') async function func(){ console.log('async'); return crypto.createHash('sha256').update('data').digest('hex') } setTimeout(func,0) console.log('sync')
Встроенный модуль шифрования не имеет встроенных в node.js опций асинхронного хеширования. Поскольку хеширование — это работа исключительно процессора, единственный способ сделать их неблокирующими и асинхронными — использовать нативные потоки в нативном коде, использовать WorkerThread или использовать дочерний процесс. Все эти параметры создают дополнительные накладные расходы, которые, вероятно, обычно не нужны. Но, если это действительно проблема для вас, вы можете запустить WorkerThread, а затем отправить ему строку, хэш которой вам нужен, и он может отправить вам обратно хеш-значение. соре за машинный перевод
Это всё равно блокирующая функция
approve в студию
Эта функция выполняет вычисление синхронно. Результат можно получить асинхронно промисом, но вычисления как были блокирубщими так и остались. Просто получение результата отсрочилось async function func(){ console.log('async'); return crypto.createHash('sha256').update('data').digest('hex') }
Достаточно понимания того, что такое промисы. Они не порождают новый поток. Поэтому синхронная операция завёрнутая в промис точно так же будет блокировать event loop
спасибо, что просветил)) я до сих пор мыслил в рамках однопоточной модели
Ну так правильно же, для упрощения можно считать что нода однопоточна. Поэтому промисы не порождают новые потоки
получается единственный способ добиться многопоточности это пилить кластер или использовать worker_threads ?
Кластер это для поднятия нескольких процессов, так же как и child_process Если нужны именно потоки, то это worker_threads
Обсуждают сегодня