Node.js和Underscore.js

时间:2014-06-17 06:09:48

标签: node.js underscore.js

我刚刚开始使用Node.js,我知道大多数操作必须使用回调才能进行非阻塞。我的问题涉及Underscore.js公开的方法。例如

_.shuffle([1, 2, 3, 4, 5, 6]);

考虑到没有提供回调,这不会被视为同步代码吗?考虑一个大的列表来洗牌。

试图掌握哪些库可以与节点一起使用,而不会影响使用节点的基本原理。

谢谢!

2 个答案:

答案 0 :(得分:6)

Node是单线程的,因此任何需要完成的工作最终都将由该线程完成。 Node的异步性质意味着它总是试图让自己忙于工作而不是等待返回数据(比如数据库调用,网络调用,磁盘访问等)。当您阅读有关确保代码是异步的内容时,这些是人们正在讨论的操作类型。

拖拽一堆数字是一堆必须由单个Node线程完成的工作,这使得这种类型的调用async不会做任何事情。所以,是的,该调用是同步的并且将阻塞线程,但实际上没有替代方案(没有产生工作线程或其他节点进程)。如果你有很多繁重的计算要做,这就是Node真的不是最好的选择的原因之一,因为它会阻塞单个线程。 Node最擅长快速完成大量短期任务。

请注意,拖拽一百万个数字可能仍然比单个数据库调用更快,因此这个特定操作不会对整体性能产生太大影响。如果您需要洗牌1亿个数字,Node可能不是正确的平台。

答案 1 :(得分:2)

是的,它是同步的,但在这个例子中(或者任何Underscore的方法)都不是问题。

许多节点API异步的原因是它们执行可能很长的操作。为此,将工作卸载到本机OS异步设备(套接字)或在单独的线程上完成。只有在工作完成后,才会将数据封送回JS域并调用回调。

在这种情况下,您将严格处理JavaScript管理的内存。只有一个线程可以访问JS内存;你不能在线程之间共享内存。这意味着你必须同步完成你的工作(洗牌)。

除非您正在处理真正的大型数组,否则这不会成为问题。


"永远不会在节点"中进行同步调用。规则确实适用于I / O和计算上昂贵的操作。这就是为什么所有网络,文件系统,加密和zlib API都是异步的原因。您会注意到URL / path解析模块等其他API是同步调用。