Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 并发、并行和异步方法之间有什么区别?_Multithreading_Asynchronous_Concurrency - Fatal编程技术网

Multithreading 并发、并行和异步方法之间有什么区别?

Multithreading 并发、并行和异步方法之间有什么区别?,multithreading,asynchronous,concurrency,Multithreading,Asynchronous,Concurrency,并发是指两个任务在不同的线程上并行运行。但是,异步方法并行运行,但在同一个线程上运行。这是如何实现的?还有,并行性呢 这三个概念之间的区别是什么?并发和并行实际上是你正确猜测的相同原则,两者都与同时执行的任务有关,尽管我想说并行任务应该是真正的多任务,在“同时”执行而concurrent可能意味着任务共享执行线程,同时看起来仍在并行执行 异步方法与前两个概念没有直接关系,异步用于呈现并发或并行任务的印象,但实际上,异步方法调用通常用于需要在当前应用程序之外执行工作的进程,我们不希望等待和阻止应用

并发是指两个任务在不同的线程上并行运行。但是,异步方法并行运行,但在同一个线程上运行。这是如何实现的?还有,并行性呢


这三个概念之间的区别是什么?

并发和并行实际上是你正确猜测的相同原则,两者都与同时执行的任务有关,尽管我想说并行任务应该是真正的多任务,在“同时”执行而concurrent可能意味着任务共享执行线程,同时看起来仍在并行执行

异步方法与前两个概念没有直接关系,异步用于呈现并发或并行任务的印象,但实际上,异步方法调用通常用于需要在当前应用程序之外执行工作的进程,我们不希望等待和阻止应用程序等待响应

例如,从数据库获取数据可能需要时间,但我们不想阻止UI等待数据。异步调用接受回调引用,并在向远程系统发出请求后立即将执行返回给代码。当远程系统执行所需的任何处理时,您的UI可以继续响应用户,一旦它将数据返回回叫方法,则该方法可以根据需要更新UI(或切换更新)

从用户的角度来看,它看起来像是多任务处理,但可能不是


编辑


可能值得补充的是,在许多实现中,异步方法调用会导致线程旋转,但这不是必需的,这实际上取决于正在执行的操作以及如何将响应通知回系统。

每个人都很难将异步与并行或并发关联起来,因为异步不是并行或并发的反义词。它是Synchronous的反义词。它只是指示某个线程是否将与其他线程同步,在本例中是另一个线程。

简而言之

并发意味着多个任务在重叠的时间段内启动、运行和完成,没有特定的顺序。并行性是指多个任务或唯一任务的多个部分同时运行,例如在多核处理器上

请记住,并发性和并行性不是一回事

并发与并行之间的差异

现在让我们列出并发和并行之间的显著区别

并发性是指两个任务可以在重叠的时间段内启动、运行和完成。并行性是指任务实际上同时运行,例如在多核处理器上

并发是独立执行进程的组合,而并行是同时执行(可能相关的)计算

并发是指同时处理很多事情。并行性是指同时做很多事情

应用程序可以是并发的,但不能是并行的,这意味着它可以同时处理多个任务,但不能同时执行两个任务

应用程序可以是并行的,但不能是并发的,这意味着它可以在多核CPU中同时处理一个任务的多个子任务

应用程序既不能并行,也不能并发,这意味着它一次按顺序处理一个任务

一个应用程序既可以是并行的,也可以是并发的,这意味着它可以在多核CPU中同时处理多个任务


并发性

当我们讨论最小两个时,并发基本上是适用的 任务或更多。当应用程序能够执行两个任务时 实际上同时,我们称之为并发应用程序。虽然在这里 任务看起来是同时运行的,但实际上可能不是。 它们利用了操作系统的CPU时间切片特性 其中每个任务运行其任务的一部分,然后进入等待状态。 当第一个任务处于等待状态时,CPU被分配给第二个任务以 完成它是任务的一部分

基于任务优先级的操作系统,分配CPU和 其他计算资源,例如内存;依次执行所有任务和 给他们完成的机会。对于最终用户来说,似乎所有任务都是 并行运行。这称为并发

并行性

并行性不需要存在两个任务。从字面上看 同时物理运行部分任务或多个任务 使用CPU的多核基础设施,通过为每个CPU分配一个核 任务或子任务

并行性需要具有多个处理单元的硬件, 基本上。在单核CPU中,您可能会获得并发性,但不会 平行性

异步方法

这与并发性和并行性无关,而是使用异步 呈现并行或并行任务的印象,但 实际上,异步方法调用通常用于进程 这需要在当前应用程序之外进行工作,而我们不需要 希望等待并阻止我们的应用程序等待响应


并发与并行: 一个时间点的并发性只能完成一个任务。示例:单cpu处理器 并行性在一个点上,我们可以完成多个任务。示例:双核或多核处理器

并发性 并发意味着应用程序同时(并发)在多个任务上取得进展。好吧,如果计算机只有一个CPU,那么应用程序可能不会在同一时间完成多个任务,但会有更多的CPU
private async void ButtonClick(object sender, RoutedEventArgs e)
{
    // run a method in another thread
    await Task.Run(()=> HeavyMethod(txt));

    // modify UI object in UI thread
    txt.Text = "done";
}

// This is a thread-safe method. You can run it in any thread
internal void HeavyMethod(TextBox textBox)
{
    while (stillWorking)
    {
        // use Dispatcher to safely invoke UI operations
        textBox.Dispatcher.Invoke(() =>
        {
            // UI operations outside of invoke will cause ThreadException
            textBox.Text += ".";
        });
    }
}