我知道异步等待的工作原理。我知道当执行到达等待时,它释放线程并在 IO 完成后,它从线程池中获取线程并运行剩余的代码。这样可以有效地利用线程。但我在某些用例中感到困惑:
最佳答案
I am aware of how async await works.
你不是。
I know that when execution reaches to await, it release the thread
事实并非如此。当执行到达 await 时,会评估可等待的操作数,然后检查操作是否完成。如果不是,则该方法的其余部分将被注册为可等待对象的延续,并且表示当前方法工作的任务将返回给调用者。
这些都不是“释放线程”。相反,控制权返回给调用者,并且调用者继续在当前线程上执行。当然,如果当前调用者是这个线程上唯一的东西,那么线程就完成了。但并不要求异步方法是线程上的唯一调用!
after IO completes
可等待对象不一定是 IO 操作,但我们假设它是。
it fetches thread from threadpool and run the remaining code.
没有。它安排剩余代码在正确的上下文中运行。该上下文可能 是线程池线程。它可能是 UI 线程。它可能是当前线程。它可能是任意数量的东西。
Should we use async methods for the very fast IO method, like cache read/write method?
等待对象被求值。如果 awaitable 知道它可以在合理的时间内完成操作,那么它完全有权执行操作并返回已完成的任务。在这种情况下没有处罚;您只是检查一个 bool 值以查看任务是否已完成。
Would not they result into unnecessarily context switch.
不一定。
If we use sync method, execution will complete on same thread and context switch may not happen.
我很困惑为什么您认为上下文切换发生在 IO 操作上。 IO 操作在操作系统线程级别以下的硬件上运行。没有线程在那里为 IO 任务提供服务。
Does Async-await saves only memory consumption(by creating lesser threads)
await 的目的是 (1) 通过允许工作流变得更加异步,从而更有效地使用昂贵的工作线程,从而在等待高延迟结果时释放线程来做工作,以及 (2) 使异步工作流的源代码类似于同步工作流的源代码。
As far as I know, in case of sync IO, while IO takes place, thread goes into sleep mode. That means it does not consume cpu. Is this understanding correct?
当然可以,但是您完全倒退了。 您想消耗 CPU。您希望一直消耗尽可能多的 CPU! CPU 正在代表用户 执行工作,如果它是空闲,那么它就不会尽可能快地完成工作。不要雇用 worker 然后付钱让他们 sleep !雇用一名 worker ,一旦他们在高延迟任务上受阻,让他们去做其他事情,以便 CPU 始终保持尽可能热。该机器的所有者为该 CPU 付出了高昂的代价;它应该一直以 100% 的速度运行,因为有工作要做!
那么让我们回到您的基本问题:
Does async await increases Context switching
我知道一个很好的方法来找出答案。编写一个使用 await 的程序,编写另一个不使用 await 的程序,同时运行它们,并测量每秒上下文切换的次数。那你就知道了。
但我不明白为什么每秒上下文切换是一个相关指标。让我们考虑两家拥有大量客户和员工的银行。在 1 号银行,员工完成一项任务,直到完成;他们从不切换上下文。如果一名员工因等待另一名员工的结果而受阻,他们就会进入休眠状态。在 2 号银行,员工在受阻时从一项任务切换到另一项任务,并不断为客户请求提供服务。您认为哪家银行的客户服务速度更快?
关于c# - async await是否增加上下文切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39795286/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我正在从erb文件切换到HAML。我将hamlgem添加到我的系统中。我创建了app/views/layouts/application.html.haml文件。我应该只删除application.html.erb文件吗?此外,仍然有/public/index.html文件被呈现为默认页面。我想创建自己的默认index.html.haml页面。我应该把它放在哪里以及如何使系统呈现该文件而不是默认索引文件?谢谢! 最佳答案 是的,您可以删除任何已转换为HAML的View的ERB版本。至于你的另一个问题,删除public/index/h
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub