crypto 里的部分加解密函数为啥是同步的?

2016-06-29 17:48:07 +08:00
 yamada

比如 crypto.publicEncrypt 、 crypto.privateDecrypt ,这种比较耗时的函数为啥是同步的而不是异步回调?不会卡住整个进程么万一调用的次数比较多的话

3773 次点击
所在节点    Node.js
32 条回复
clino
2016-06-29 17:58:00 +08:00
问题是 nodejs 是多线程的吗?
ncisoft
2016-06-29 18:04:20 +08:00
linux 系统调用也大多是同步的
2225377fjs
2016-06-29 18:04:26 +08:00
为什么要异步。。?加密解密本来就是 CPU 运算,又不是 IO ,有等待, CPU 空闲出来了,所以做成异步,让 CPU 做别的事情去。。。加解密的时候 CPU 本来就没空闲,难道将加密解密的运算派发到别的并行线程去做,强行做成异步的?这样有啥好处?又不能提高整个系统的吞吐量。
何为卡主整个进程?如果因为 IO 之类的等待,整个执行过程被挂起,这个才叫卡住了。加解密的时候执行线程就一直在运算,何来卡主整个进程而言。?
(感觉楼主还需要学习一些基本概念)
yamada
2016-06-29 18:08:28 +08:00
@2225377fjs 想明白了, CPU 密集运算确实不需要异步
billlee
2016-06-29 19:48:01 +08:00
@clino node.js 是真是多线程的,你可以 ps -eL 看一下。异步磁盘 IO, 应该用多线程模拟的吧
edsgerlin
2016-06-29 20:54:44 +08:00
@2225377fjs 其实强行做成异步也不是不行。
CRVV
2016-06-29 21:50:22 +08:00
@2225377fjs 照你这么说为啥从 redis 取数据要做成异步的?
ChiChou
2016-06-29 21:51:37 +08:00
@CRVV 从 redis 取数据是从 socket 读取的,属于 I/O 操作了
CRVV
2016-06-29 22:03:07 +08:00
@yamada
crypto.pbkdf2 是异步的
异步的用着麻烦,而且增加函数调用的开销。同步的当然会影响性能
所以有个权衡的,所以 pbkdf2 还有个 pbkdf2Sync ,让用户根据情况选择用不用异步

这事和是不是 CPU 密集根本没有关系
CRVV
2016-06-29 22:10:09 +08:00
@ChiChou redis 这个例子的确不对
其实 crypto 里到处都是 CPU 密集的异步的例子, Cipher 、 Hash 之类的
yamada
2016-06-29 22:37:13 +08:00
@CRVV 看了下文档, hash 是同步啊, crypto 里只有 crypto.pbkdf2(password, salt, iterations, keylen, digest, callback)和 crypto.randomBytes(size[, callback])是异步
billlee
2016-06-29 22:51:47 +08:00
@yamada hash 支持 stream 接口,这算是异步了吧。不过 CPU 密集用异步确实没意义,徒增开销。
abcdabcd987
2016-06-29 23:03:07 +08:00
@billlee 我觉得还是有意义的,新开一个 worker ,把计算任务丢进去,发挥多核优势?
magicdawn
2016-06-29 23:13:23 +08:00
终于有人提了...随便用一下 hash / hmac / Cipher / Decipher 都会 stop the world ...
对于服务端能容忍么...不能哎
shyling
2016-06-30 00:21:31 +08:00
如果是 pure js 实现的话,同步无可厚非。。如果是 c/c++的话,交给 worker thread 回调貌似更好一点。很多计算也不一定能用到多核,如果能够不影响 v8 线程感觉也是不错的,毕竟处理器不仅仅有(完全空闲,完全占满) 2 种状态。不过具体的就不知道了。。
CupTools
2016-06-30 05:44:20 +08:00
@2225377fjs “不能再同意更多”
haozhang
2016-06-30 08:47:10 +08:00
我猜同步的那几个 api 是将任务下发给底层 c++,然后 js 运行时的线程阻塞等待底层加密的结果,而异步 api 不会造成 js 线程的阻塞。
yamada
2016-06-30 09:52:53 +08:00
仔细想了下, cpu 密集运算异步也是有意义的,假如有个 cpu 密集运算函数,在同步下要耗时 1000ms ,同时会 stop the world ,在异步下要耗时 1500ms ,但可以把 cpu 分给其他任务使用,那我宁愿选择后者,毕竟假如没有其他任务的时候,异步耗时也只会有 1050ms
clino
2016-06-30 09:59:09 +08:00
@yamada 所以关键还是是否多线程啊,多线程才能利用到多核
yamada
2016-06-30 10:08:48 +08:00
@clino 这里不谈多核问题,这和单核多核没关系,就算单核,我也是愿意让 cpu 运算函数执行时间变长,把 cpu 时间分给其他任务

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/289170

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX