asio 的作者 Christopher Kohlhoff 正在为 C++ 执行程序开发一个库和提案。到目前为止,他的工作包括这个 repo和 docs .不幸的是,基本原理部分尚未编写。到目前为止,文档给出了图书馆功能的一些示例,但我不觉得我遗漏了什么。不知何故,这不仅仅是一系列奇特的调用函数。
我在 Google 上可以找到的所有内容都是非常特定于 Java 的,其中很多都是特定于特定框架的,所以我很难弄清楚这个“执行程序模式”到底是什么。
在这种情况下执行者是什么?他们在做什么?它们何时会有所帮助的典型示例是什么?执行者之间存在哪些差异?执行者的替代方案是什么?它们如何比较?特别是,似乎与事件循环有很多重叠,其中事件是初始输入事件、执行事件和关闭事件。
在尝试找出新的抽象概念时,我通常会发现理解动机是关键。那么对于执行者来说,我们要抽象什么,为什么?我们试图使什么通用?如果没有执行者,我们还要做哪些额外的工作?
最佳答案
执行器最基本的好处是将程序并行性的定义与其使用方式分开。 Java 的执行器模型之所以存在,是因为总的来说,当您第一次编写代码时,您实际上并不知道哪种并行模型最适合您的场景。您可能从并行性中获益甚微,根本不应该使用线程,您可能最好为每个核心使用一个长时间运行的专用工作线程,或者根据当前负载动态扩展线程池,在线程运行后清理线程。已经闲置了一段时间以减少内存使用、上下文切换等,或者可能只是按需为每个任务启动一个线程,在任务完成时退出。
这里的关键是,当您第一次编写代码时,几乎不可能知道哪种方法最好。您可能知道并行性可能在哪些方面对您有帮助,但在传统线程中,您最终会将并行性“配置”(何时以及是否创建线程)与并行性的使用(确定要调用哪些函数)混合在一起什么论据)。当您像这样混合代码时,对不同选项进行性能测试非常痛苦,因为每个线程启动都是独立的,必须单独更新。
执行器模型的主要好处是并行配置在一个地方(创建执行器的地方)完成,用户执行者不必知道任何关于它的事情。他们只是将工作提交给执行者,接收 future ,并在稍后的某个时候,从 future 检索结果(必要时阻塞)。如果您想尝试其他配置,您可以更改定义执行程序的一行并再次运行您的代码。即使您决定需要为代码的不同部分使用不同的并行模型,与手动重写每个站点的线程细节相比,重构以添加第二个执行程序并将第一个执行程序的某些用户更改为使用第二个执行程序很容易;只要执行者的名字(相对)唯一,找到用户并更改他们以使用不同的用户就非常容易。执行器既简化了您的代码(通过避免将线程创建/管理与线程执行的任务混在一起),又简化了性能测试。
作为一个附带的好处,您还抽象出了将数据传入和传出工作线程的复杂性(提交方法封装了前者, future 的 result 方法封装了后者)。 std::async 为您带来一些好处,但无法真正控制所涉及的并行性(只是选择是/否/可能选择是否强制线程,强制在当前线程中延迟执行,或者让编译器/库决定,没有细粒度控制是否使用线程池,如果使用,它的行为方式)。真正的执行器框架为您提供了 std::async 无法提供的控制,并且具有类似的易用性。
关于c++ - C++ 上下文中的执行程序模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42177803/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此