C#等线程语言上的线程与异步?

时间:2017-02-15 09:39:18

标签: javascript c# multithreading asynchronous

我正在研究JavaScript的单线程异步处理和C#的异步处理线程方法之间的区别,如此处所述(Node.js vs Async/await in .net)。在我看来,“异步编码”可以总结C#或Java等语言中“使用线程”的全部内容。是这种情况吗?

我对线程的理解是在两个独立的处理器上同时执行的代码,据我所知,这涉及:

  1. 解雇单独的流程
  2. 异步任务处理,基于'现在'和'稍后'
  3. 将任务拆分为在不同线程上运行然后合并结果的部分任务
  4. 在我看来,第2/3点是以与JavaScript相同的逻辑方式有效地处理异步代码。虽然我(我想)我明白在“上下文”方面存在差异需要添加到新线程中吗?但它似乎异步 - 等待摘要,如果他们不... ...

    除了我所提到的,在处理异步代码方面,JavaScript开发人员的观点有何不同?从我对C#的缺乏经验的角度来看,似乎JavaScript中的异步编码与C#中的多线程编码有许多相似之处。虽然有不同的用例...我可以看到的一个区别是JavaScript中的代码永远不会同时执行其他代码,而在C#中可能 - 这是“线程安全”的概念来自何处?即一个线程的状态不能被另一个线程上的操作改变(我认为)......

    这是对的吗?如果没有,有什么区别?

1 个答案:

答案 0 :(得分:3)

异步和多线程都是并发形式:

  • 并发:一次做多件事。
  • Asynchrony:启动操作并释放当前线程以执行其他操作,直到该操作完成。
  • 并行/多线程:使用多个线程同时执行多个操作。
  

我在研究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#中的任何类型的并行代码都需要确保它是线程安全的。多线程环境中的异步代码 也会遇到线程安全问题,但这种情况更为罕见(大多数异步代码都是串行代码,没有线程安全问题)。