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

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

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

3967 次点击
所在节点    Node.js
32 条回复
clino
2016-06-30 10:13:06 +08:00
@yamada 那也需要多线程,否则也做不到你说的"让 cpu 运算函数执行时间变长,把 cpu 时间分给其他任务"
需要开新线程跑 cpu 密集型任务
yamada
2016-06-30 10:13:39 +08:00
@2225377fjs
如果因为 IO 之类的等待,整个执行过程被挂起,这个才叫卡住了。加解密的时候执行线程就一直在运算,何来卡主整个进程而言。?

你就把加解密一直在运算当做等待好了,那不就是卡住了整个进程么?我希望能异步运算,这样就还能处理其他任务,就算会降低性能,我仍然希望如此
yamada
2016-06-30 10:17:15 +08:00
@clino 可不可以把异步假设为"开新线程来执行"?我不懂 nodejs 的异步原理,刚学,说到底 nodejs 不适合干这种活,我还是用其他的方法来加解密吧
clino
2016-06-30 10:21:57 +08:00
@yamada 异步不一定非要开新线程,但是 cpu 密集型的你不开新线程做的话 效果跟同步是一样的
这个跟语言没关系,因为一个 cpu 核同时只能跑一个线程
2225377fjs
2016-06-30 10:49:50 +08:00
@abcdabcd987
@yamada
@haozhang
@billlee
充分利用系统资源,提高真个系统吞吐量, node 的并行是通过多进程来实现的, libuv 确实也有多线程,但是这只是为了做磁盘 IO 做的(印象中好像还有 DNS 的一些操作),而不是用来跑任务,用并行多线程确实可以将运算交给另外一个线程,这样来做成异步的,但是 node 的多线程可不是为了这个存在的。
对于纯异步,多进程的系统,例如 nodejs ,单个进程中再引入并行的多线程来执行 CPU 运算,并不能提高系统的吞吐量,反而会引入其他的问题,对于负载很高的时候,更应该做的是如何将各个任务分布到各个 worker 进程来做,从而利用 CPU 资源。
也有多进程的系统也引入了多线程,例如 Nginx 之类的,但是他们的 IOLoop 和主逻辑也还是在同一个线程中执行的,这些引入的其他线程更多的是为隔离上层代码的阻塞,例如 Nginx 去同步的请求外部的系统,上层一些逻辑不得不阻塞, upstream 配套起来用。

上面很多说的通过开多个线程,提高系统性能啥的,这个不是 Node 的系统模型,而是 Java 环境下的模型,人家是单进程多线程。

而且正确的实现多线程程序不是那么简单事情, jvm 上面发展了很多年才有的现在强大的内存,并发模型,各种优秀的并行库和组件,这些方面 nodejs 还差的很远。。。
haozhang
2016-06-30 10:57:03 +08:00
@2225377fjs 你就扯吧...还多进程...IOCP 和 epoll 被你吃了?
2225377fjs
2016-06-30 11:07:11 +08:00
@haozhang 你确定我在扯? epoll 或者 kqueue 或者 iocp 是 ioloop 的实现基础,他们跟多进程多线程是同一个维度的东西。。?知道几个东西的名字就能上来装逼了?成本这么低。?不要上来就喷,把这些基础知识搞清楚了再说吧。。。
你清楚 libevent , libev , libuv , nginx , netty , gevent 这些东西的 io 模型或者说并发模型?如果你懂的话,你可以喷。。。。如果你狗屁不通,上来就喷,那你跟 sb 喷子有啥区别。。?不过看你这个帖子的回复,我觉得你不懂,如果你懂的话,你是不会有这么弱智的回复的。
haozhang
2016-06-30 11:37:50 +08:00
@2225377fjs 对的对的这些模型全是靠多进程的,和多线程没什么事!你说的好!
haozhang
2016-06-30 11:40:43 +08:00
给跪了, Nodejs 靠多进程实现非阻塞 IO 的神论都出来了!神贴!
2225377fjs
2016-06-30 12:03:33 +08:00
@haozhang 我说过 nodejs 靠多进程实现非阻塞 IO ?什么叫并行,什么叫并发?我说的是 nodejs 要实现并行应该是通过多进程来做,通过多进程来充分利用系统资源。
进程线程跟 epoll 这些玩意是同一个维度的东西。。?我能说你这是恶意乱说我的意思。?或者说你根本就没看懂我的回帖的意思。

要通过线程来实现并行计算,提高系统的计算能力,那不是 nodejs 要做的事情, nodejs 现在的框架基础也不支持这些东西,因为他根本就没有成熟的并行环境下的内存模型, java 那么多同步组件是吃白饭的,线程级别的并行也不是简简单单加个锁这么简单的事情,除了同步,还有内存可见性之类的问题。。。对于同一个数据域,在并行线程环境下,两个线程可能看到的是不同的值,这些都需要同步与内存模型来保证不会出现这种问题。 node 的框架基础根本就没有提供这些东西,因为 node 本身根本就没有想过要提供线程级别的并行,而是让系统做成多进程,这也是为什么大家说 node 不适合 CPU 运算要求特别高的任务,其实这里还少了一点东西,那就是 CPU 运算要求特别高而且业务功能模块交互比较频繁的任务不适合 node ,单纯 cpu 密集型的任务用 node 来做没问题,多开进程就行,只要各个任务之间都是独立的,交互很少。

node 要强行实现线程并行也可以的, c++的 boost 库也有很多并行组件可用,但是这已经脱离的 nodejs 范畴。

你这明明什么都不懂,和稀泥有意思?
Keyes
2016-06-30 22:05:58 +08:00
@2225377fjs 你俩都不是一个 LEVEL 的,去喝茶 CODING 吧,别浪费时间了,你意思懂的人都懂
Fontaine
2016-07-10 17:29:48 +08:00
讨论了那么多,还是都搞清楚 node 运行在哪里,搞清楚为啥 node 叫单进程单线程,就先看看 v8

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

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

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

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

© 2021 V2EX