阻止代码比非阻塞代码有什么好处?

时间:2015-01-16 19:50:27

标签: javascript node.js asynchronous

我正在学习JavaScript和Node。我理解异步的东西如何工作。我明白为什么它可以大大加快速度。

我看到其他语言(如Ruby和Java?)被设计为阻塞。为什么呢?

我有一个模糊的想法,你可以使用线程来处理事情需要很长时间的情况。与异步做事相比,这有什么优点和缺点?

3 个答案:

答案 0 :(得分:2)

阻塞或同步代码易于编写,以及默认的单线程行为。当每个任务依赖于下一个任务时,阻塞代码是有意义的。在多处理器和多线程之前,这是历史上唯一可用的替代方案。

创建非阻塞,异步,多线程编程,以便在可以并行执行多个任务的情况下提高性能。这样可以提高性能,但代价是增加复杂性,使代码维护更加困难。

答案 1 :(得分:0)

首先值得注意的是,javascript几乎不会允许您访问多个核心。因此,您(通常)不会看到非阻塞代码的速度增益。这是非阻塞代码在其他语言中的主要优点之一。在javascript中,异步代码通常用于处理事件(例如用户输入或文件下载),在这些事件中您不希望停止所有事件并等待事件,因为它可能需要一段时间(或从未发生)。异步代码的主要缺点是代码复杂性。每当你编写异步代码时,你需要注意两个线程同时弄乱一个对象等。

答案 2 :(得分:0)

还有阻止JavaScript运行时环境,如RingoJS或早期Node竞争对手。如果代码长时间运行并且不能分成不同的部分,则阻塞代码具有优势。如果您不能依赖非阻塞IO作为基本调度间隔,则阻塞可能是更好的解决方案。

请考虑以下情况:您的传入请求不是内容的KB,它们是数百兆字节。并且您的代码一次性读取所有传入的字节。如果在事件循环中解析此类请求,它将阻止队列中的所有其他请求,这些请求必须等待处理。阻塞运行时使这更容易,因为一个线程可能从CPU中拉出而另一个线程继续处理他的大输入,但两者都并行激活。

阻止环境中的真正问题是共享状态。如果许多线程可以访问同一个变量,则需要进行同步,这会导致大量资源浪费。这就像在非阻塞环境中阻止事件循环:只是不要这样做。

我个人认为阻止代码更易于阅读和理解,因为它遵循一行执行并且没有回调或未来。但这取决于你想要解决的问题。双方在各种情况下都有利弊。