通过非阻塞代码阻止代码有什么优势?

我正在学习JavaScript和Node。 我明白asynchronous的东西如何工作。 我明白为什么它可以显着加快速度。

我发现其他语言(如Ruby和Java?)被devise为阻塞。 为什么?

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

阻塞或同步代码很容易编写,并且是默认的单线程行为。 当每个任务取决于下一个,然后阻止代码是有道理的。 在多处理器和multithreading之前,这是历史上唯一可用的select。

在可以并行执行多个任务的情况下,创build了非阻塞,asynchronous,multithreading的编程来提高性能。 这提高了性能,但是以增加复杂性为代价,使代码维护变得更加困难。

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

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

只要想想下面的情况:你的传入请求不是一些KB的内容,他们是几百兆字节。 你的代码一次读取所有传入的字节。 如果在事件循环中parsing这些请求,它将阻塞队列中的所有其他请求,这些请求必须等待处理。 由于一个线程可能从CPU中被拉出,而另一个线程继续在他的大input上工作,但是两者都是并行的,所以阻塞运行时间使得这更容易。

阻塞环境中的真正问题是共享状态。 如果很multithreading访问同一个variables,就需要同步,这会导致大量浪费的资源。 这就像阻塞非阻塞环境中的事件循环:只是不要这样做。

就我个人而言,我发现阻止代码更容易阅读和理解,因为它遵循一行执行,没有callback或期货。 但这取决于你想解决的问题。 双方在各种情况下都有利有弊。