我正在阅读有关 async/await 的内容以及何时 Task.Yield 可能有用并遇到 this post.我对该帖子的以下内容有疑问:
When you use async/await, there is no guarantee that the method you call when you do await
FooAsync()will actually run asynchronously. The internal implementation is free to return using a completely synchronous path.
这对我来说有点不清楚,可能是因为我脑海中的异步定义不一致。
在我看来,由于我主要从事 UI 开发,异步代码是不在 UI 线程上运行,而是在其他线程上运行的代码。我想在我引用的文本中,如果一个方法在任何线程上阻塞(即使它是一个线程池线程),它就不是真正的异步。
问题:
如果我有一个受 CPU 限制的长时间运行的任务(假设它正在做大量的数学运算),那么异步运行该任务一定会阻塞某些线程,对吧?必须做一些实际的计算。如果我等待它,那么某些线程会被阻塞。
真正异步方法的示例是什么?它们实际上是如何工作的?这些是否仅限于利用某些硬件功能的 I/O 操作,因此不会阻塞任何线程?
最佳答案
This is a little unclear to me probably because the definition of asynchronous in my head is not lining up.
很高兴你要求澄清。
In my mind, since I do mainly UI dev, async code is code that does not run on the UI thread, but on some other thread.
这种看法很普遍,但却是错误的。不要求异步代码在任何第二个线程上运行。
假设您正在做早餐。你在 toastr 里放了一些 toast ,在等待 toast 弹出时,你查看了昨天的邮件,支付了一些账单,嘿, toast 弹出了。你付完账单,然后去给你的 toast 涂黄油。
你在哪里雇佣了第二个 worker 来看你的 toastr ?
你没有。线程是 worker 。异步工作流可以全部发生在一个线程上。异步工作流的要点是避免雇佣更多的 worker ,如果你能避免的话。
If I have a long running task that is CPU bound (let's say it is doing a lot of hard math), then running that task asynchronously must be blocking some thread right? Something has to actually do the math.
在这里,我给你一个很难解决的问题。这是一列 100 个数字;请用手把它们加起来。所以你把第一个加到第二个上,做一个总数。然后将运行总计添加到第三个并得到总计。然后,哦,见鬼,第二页的数字不见了。记住你在哪里,然后去 toast 。哦,当干杯时,一封包含剩余数字的信到了。涂完 toast 后,继续将这些数字相加,下次有空时记得吃 toast 。
您雇用另一名 worker 添加数字的部分在哪里? 计算量大的工作不需要同步,也不需要阻塞线程。使计算工作可能异步的是能够停止它,记住你在哪里,去做其他事情,记住在那之后做什么,然后从你离开的地方继续。
现在肯定可能雇用第二个除了加数字什么都不做的 worker ,然后被解雇。你可以问那个 worker “你完成了吗?”如果答案是否定的,你可以去做一个三明治,直到他们完成。这样你和 worker 都很忙。但是没有要求异步涉及多个 worker。
If I await it then some thread is getting blocked.
不不不不。这是你误解的最重要的部分。
What is an example of a truly asynchronous method and how would they actually work? Are those limited to I/O operations which take advantage of some hardware capabilities so no thread is ever blocked? 异步工作通常涉及自定义硬件或多线程,但实际上并不需要。 不要考虑 worker 。想想工作流程。异步的本质是将工作流分解成小部分,这样您可以确定这些部分必须发生的顺序,然后依次执行每个部分,但允许相互没有依赖关系的部分交错。 在异步工作流中,您可以轻松地检测到工作流中表达各部分之间依赖关系的地方。这些部分用 await 并不意味着“异步开始这项工作”。 await 的意思是“我这里有一个异步生成的结果可能不可用。如果不可用,在这个线程上找一些其他的工作这样我们就 strong>不阻塞线程。等待是您刚才所说的相反。
await 标记。这就是 await 的意思:后面的代码取决于这部分工作流是否完成,所以如果没有完成,就去找其他任务做,等任务完成后再回来完成了。重点是让员工继续工作,即使在未来产生所需结果的世界中也是如此。
关于c# - 关于线程的混淆以及异步方法在 C# 中是否真正异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43989344/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类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
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案