草庐IT

c++ - 线程 vs 基于任务 vs 异步编程

coder 2023-05-31 原文

我是这个概念的新手。这些是相同的还是不同的东西?有什么不同?我真的很喜欢能够同时运行两个进程的想法,例如,如果我有几个大文件要加载到我的程序中,我希望同时加载尽可能多的文件,而不是一次等待一个。并且在处理大文件(例如 wav 文件)时,最好将其分解为多个部分,同时对多个块进行处理,然后再将它们重新组合在一起。我想研究什么来学习如何做这种事情?

编辑:另外,我知道在多核处理器上使用多个核心适合这里的某个地方,但显然异步编程并不一定意味着您使用多个核心?如果您没有多个内核可以利用,为什么要这样做?

最佳答案

它们是相关的,但又是不同的。

线程,通常称为多线程,是指在单个进程中使用多个执行线程。这通常是指使用一小组线程的简单情况,每个线程执行不同的任务,这些任务需要或可以从同时运行中受益。例如,一个 GUI 应用程序可能有一个线程绘制元素,另一个线程响应鼠标点击等事件,另一个线程执行一些后台处理。

然而,当线程数,各司其职,走极端时,我们通常会开始谈论Agent-based approach .

基于任务的方法是指软件工程中的一种特定策略,在抽象术语中,您动态创建要完成的“任务”,这些任务由任务管理器拾取,任务管理器将任务分配给可以完成它们的线程。这更像是一个软件架构的事情。这里的好处是整个程序的执行是一连串的任务被中继(任务A完成->触发任务B,当任务B和任务C都完成->触发任务D等),而不是必须编写一个大函数或程序,一个接一个地执行每个任务。当不清楚哪些任务比其他任务花费更多时间时,以及当任务只是松散耦合时,这提供了灵活性。这通常通过 thread-pool 实现(正在等待分配任务的线程)和一些 message-passing interface (MPI)传达数据和任务“契约(Contract)”。

异步编程不是指多线程编程,尽管两者经常相关联(并且可以很好地协同工作)。同步程序必须先完成每一步,然后才能进行下一步。异步程序开始一个步骤,然后转到不需要第一步结果的其他步骤,然后在需要结果时检查第一步的结果。

也就是说,一个同步程序可能有点像这样:“做这个任务”、“等到完成”、“用结果做某事”和“继续做其他事”。相比之下,异步程序可能更像这样:“我要开始一项任务,稍后我需要结果,但我现在不需要”,“同时,我”我会做别的事情”,“在我现在得到第一步的结果之前我不能做任何其他事情,所以我会等待它,如果它没有准备好”,和“继续做别的事情”。

请注意,“异步”指的是 very broad concept ,这总是涉及某种形式的“开始一些工作并告诉我何时完成”而不是传统的“立即做!”。这不需要多线程,在这种情况下,它只是成为一种软件设计选择(通常涉及回调函数和类似的东西,以提供异步结果的“通知”)。使用多线程,它变得更强大,因为您可以在异步任务工作时并行执行各种操作。走极端,它可以变成一个更成熟的架构,就像基于任务的方法(这是一种异步编程技术)。

我认为你想要的东西更符合另一个概念:Parallel Computing (或并行处理)。这种方法更多的是将大型处理任务拆分为较小的部分并并行处理所有部分,然后组合结果。您应该查看类似 OpenMP 的库或 OpenCL/CUDA(用于 GPGPU)。也就是说,您可以使用多线程进行并行处理。

but apparently asynchronous programming doesn't necessarily mean you are using multiple cores?



异步编程不一定涉及在多个线程中并发发生的任何事情。这可能意味着操作系统在幕后代表您做事(并在该工作完成时通知您),就像在异步 I/O 中一样,无需您创建任何线程。它归结为一种软件设计选择。

Why would you do this if you didn't have multiple cores to take advantage of?



如果您没有多核,多线程仍然可以通过重用“等待时间”来提高性能(例如,不要“阻塞”等待文件或网络 I/O 的处理,或等待用户单击某个鼠标按钮)。这意味着程序可以在等待这些事情的同时做有用的工作。除此之外,它可以在设计中提供灵活性并使事情看起来同时运行,这通常会让用户更快乐。尽管如此,您在多核之前是正确的CPU s,没有那么多的动力去做多线程,因为 yield 通常不能证明开销是合理的。

关于c++ - 线程 vs 基于任务 vs 异步编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20434220/

有关c++ - 线程 vs 基于任务 vs 异步编程的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  2. ruby-on-rails - Railstutorial : db:populate vs. 工厂女孩 - 2

    在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo

  3. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  6. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  7. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  8. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  9. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐