我正在研究JavaScript的单线程异步处理和C#的异步处理线程方法之间的区别,如此处所述(Node.js vs Async/await in .net)。在我看来,“异步编码”可以总结C#或Java等语言中“使用线程”的全部内容。是这种情况吗?
我对线程的理解是在两个独立的处理器上同时执行的代码,据我所知,这涉及:
在我看来,第2/3点是以与JavaScript相同的逻辑方式有效地处理异步代码。虽然我(我想)我明白在“上下文”方面存在差异需要添加到新线程中吗?但它似乎异步 - 等待摘要,如果他们不... ...
除了我所提到的,在处理异步代码方面,JavaScript开发人员的观点有何不同?从我对C#的缺乏经验的角度来看,似乎JavaScript中的异步编码与C#中的多线程编码有许多相似之处。虽然有不同的用例...我可以看到的一个区别是JavaScript中的代码永远不会同时执行其他代码,而在C#中可能 - 这是“线程安全”的概念来自何处?即一个线程的状态不能被另一个线程上的操作改变(我认为)......
这是对的吗?如果没有,有什么区别?
答案 0 :(得分:3)
异步和多线程都是并发形式:
我在研究JavaScript的单线程异步处理和C#的异步处理线程化方法之间的区别
我相信我对这个问题的回答会误导你一点。当我谈到"异步多线程"时,我的意思是异步存在于多线程环境中。我不意味着使用多线程实现异步
。JavaScript(现在)被锁定在一个单线程模型中(暂时搁置Web工作者之类的东西,就像线程一样)。因此,异步自然是在一个线程上完成的。请注意,纯异步不需要一个线程进行异步操作;例如,当您进行Web API调用时,没有必须坐的线程,等待响应返回。 Node.js(和浏览器JavaScript)使用类似于我的帖子There Is No Thread中的技术,加上一个线程池来包装少量的阻塞API。
这里要注意的重要一点是,异步不需要线程。原则上,它是一种并发形式,可以是无线程的。在服务器端,这允许很大程度的可伸缩性。
JavaScript停在那里,至少目前如此。 Node.js在单个线程(不包括线程池)上可以很好地扩展,因为它强制执行异步。 ASP.NET采用了不同的方法:异步在历史上一直很难用,所以ASP.NET首先是多线程,然后允许异步或同步代码;现代服务可以在多线程环境中使用异步,以实现更高的可伸缩性。
在我看来,异步编码'可以总结使用线程的全部内容'用C#或Java这样的语言。是这种情况吗?
没有。有一类工作不适合异步:CPU绑定算法。在这种情况下,你的工作"具有必须在实际CPU上运行的实际CPU代码。如果您正在做类似的事情,那么您需要真正的线程。在这种情况下,您需要并行而不是异步。并行性正慢慢进入JavaScript,但它们从非常低的水平开始,并且在高级并行性是一个可行的选择之前还需要一段时间。
附注:C#代码可以选择在一个线程上运行异步代码。实际上,这是客户端应用程序(桌面/移动设备上的UI应用程序)的默认环境。多线程异步环境通常仅在服务器上使用,例如ASP.NET。
我对线程的理解是在两个独立的处理器上同时执行的代码
它可以。这取决于机器中的核心以及机器正在做什么。 .NET提供了高级并行抽象,可以将您的工作分成块并在线程之间分配,线程在核心上运行,并以高度智能和自适应的方式完成所有这些。 JavaScript目前没有像这样的并行支持。
在我看来,第2/3点是以与JavaScript相同的逻辑方式有效地处理异步代码。
是的,除了JavaScript异步代码不能受CPU约束这一事实。例如,您可以在.NET上使用并行性来计算分形;您不能仅使用async
/ await
(不论语言)来执行此操作。
从我对C#的缺乏经验的角度来看,似乎JavaScript中的异步编码与C#中的多线程编码有许多相似之处。
从高层面来看,是的:它们是两种形式的并发。
如果您的意思是JavaScript中的async
/ await
与C#中的async
/ await
相似,那么是的,它们实际上是相同的。 async
/ await
用于在两种语言中实现异步。
虽然有不同的用例...我可以看到的一个区别是JavaScript中的代码永远不会与其他代码同时执行,而在C#中可能 - 这就是“线程安全”的概念。 ;来自?即一个线程的状态不能被另一个线程上的操作改变(我认为)...
是的,只要您有多线程,就需要确保线程安全。因此,C#中的任何类型的并行代码都需要确保它是线程安全的。多线程环境中的异步代码 也会遇到线程安全问题,但这种情况更为罕见(大多数异步代码都是串行代码,没有线程安全问题)。