关于这个话题,我有一个问题:bcrypt.compare()是异步的,这是否意味着一定会发生延迟?
因为我不能发表评论,因为我的会员水平,我不得不打开新的话题。
我的问题是,使用bcrypt.compareSync()而不是异步版本的bcrypt.compare()有什么坏处?
compareSync()肯定给出了正确的结果。那么,为什么不使用它并使用包装在承诺中的compare()呢?它会阻止nodeJS为其他用户服务吗?
发布于 2021-09-25 08:52:01
使用异步方法而不是同步方法的原因在项目的自述中得到了很好的解释。
为什么推荐异步模式而不是同步模式? 如果您在一个简单的脚本上使用bcrypt,那么使用同步模式是非常好的。但是,如果您在服务器上使用bcrypt,则建议采用异步模式。这是因为bcrypt所做的散列是CPU密集型的,因此同步版本将阻止事件循环,并阻止应用程序为任何其他入站请求或事件提供服务。异步版本使用不阻塞主事件循环的线程池。
https://github.com/kelektiv/node.bcrypt.js#why-is-async-mode-recommended-over-sync-mode
因此,如果您在you应用程序或其他不想阻塞主线程的环境中使用此功能,则应该使用异步版本。
发布于 2021-09-25 08:44:59
Node.js本机方法具有同步附加方法,如fs.writeFileSync、crypto.hkdfSync、child_process.execSync。浏览器中的JavaScript是用所有需要线程阻塞的本机函数异步实现的,但是Node.js中的Sync方法实际上会阻塞线程,直到任务完成为止。
在Callback或Promise中使用Node.js时,如果只在内部执行异步逻辑,则可以在不停止主线程的情况下管理异步任务,同时继续执行其他任务(使用Callbak、Promise.all计数)。
同步方法在工作结束后运行下一行,因此很容易识别执行顺序,并且易于编写代码。但是,主线程被阻塞,所以一次不能完成多个任务。
考虑下一个例子。
const syncFunc = () => {
for (let i = 0; i < 100; i++) fs.readFileSync(`/files/${i}.txt`);
console.log('sync done');
};
const promiseFunc = async () => {
await Promise.all(Array.from({length: 100}, (_,i) => fs.promises.readFile(`/files/${i}.txt`)));
console.log('promise done');
};如果读取所有100 txt文件没有问题,则诺言函数的结束速度要快得多。
此同步特性同样适用于由C语言组成的库。如果您查看下面的代码,您可以看到在C++中实现的不同。
总之,我认为这是一个选择的问题。使用Sync方法是没有问题的,如果您生成的代码是在单个线程上运行的逻辑,如果主线程被阻塞(比如简单宏),这并不重要。但是,如果您正在创建的逻辑中,性能问题(例如服务器)很重要,并且主线程不应该在线程或异步管理中尽可能地停止,则可以选择Promise或Callback。
https://stackoverflow.com/questions/69324159
复制相似问题