- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在异步编程模型(更具体地说 - 使用回调而不是阻塞线程)中编写代码的主要目的之一是尽量减少系统中阻塞线程的数量。
对于运行线程,这个目标是显而易见的,因为上下文切换和同步成本。
但是阻塞的线程呢?为什么减少它们的数量如此重要?
例如,当等待来自网络服务器的响应时,线程被阻塞并且不占用任何 CPU 时间并且不参与任何上下文切换。
所以我的问题是:除了 RAM(每个线程大约 1MB?)阻塞的线程占用了哪些其他资源?
还有一个更主观的问题:在什么情况下,这种成本真的证明编写异步代码的麻烦是合理的(例如,代价可能是将你的良好连贯方法拆分为许多 beginXXX 和 EndXXX 方法,并将参数和局部变量移动到类字段)。
更新 - 我没有提到或没有给予足够重视的其他原因:
更多线程意味着对公共(public)资源的更多锁定
更多线程意味着更多线程的创建和处理,这是昂贵的
系统肯定会用完线程/RAM,然后停止为客户端提供服务(在 Web 服务器场景中,这实际上会导致服务中断)
最佳答案
So my question is: other than RAM (about 1MB per thread ?) What other resources do blocked threads take-up?
这是最大的一个。话虽如此,.NET 中的 ThreadPool 允许每个内核有这么多线程是有原因的 - 在 3.5 中 the default was 250 worker threads per core in the system . (在 .NET 4 中,它取决于虚拟地址大小、平台等系统信息 - 现在没有固定的默认值。)线程,尤其是阻塞的线程,真的没有那么昂贵......
但是,我想说,从代码管理的角度来看,减少阻塞线程的数量是值得的。每个阻塞的线程都是一个操作,在某个时候应该返回并变得畅通。拥有许多这些意味着您需要管理相当复杂的代码集。减少这个数字将有助于使代码库更简单 - 并且更易于维护。
And another more subjective question: In what cases will this cost really justify the hassle of writing asynchronous code (the price could be, for example, splitting your nice coherent method to lots of beginXXX and EndXXX methods, and moving parameters and local variables to be class fields).
现在,这通常是一种痛苦。这在很大程度上取决于场景。 Task<T>
然而,.NET 4 中的类在许多情况下极大地改进了这一点。使用 TPL,与以前使用 APM(BeginXXX/EndXXX)甚至 EAP 相比,痛苦要小得多。
这就是语言设计者为 improving this situation in the future 投入如此多精力的原因.他们的目标是使异步代码更易于编写,以便更频繁地使用它。
关于c# - 阻塞的线程占用了哪些资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4098854/
有人告诉我,如果我只有一个“东西”,比如家(不是多个家),我应该在 routes.rb 中使用资源 :home,而不是资源 :home。但是当我查看路由时,POST 函数似乎想要 home#creat
Activity 开始。这些代码框架顺利通过。 // Initialize array adapters. One for already paired devices and //
资源 search-hadoop.com search-hadoop.com索引所有邮件列表,非常适合历史搜索。当你遇到问题时首先在这里搜索,因为很可能有人已经遇到了你的问题。 邮件列表 在A
我是 WPF 的新手,正在努力使用位于单独程序集中的样式。这就是我正在做的:- 我有一个带有\Themes 文件夹的类库项目,其中包含一个“generic.xaml”,它合并了\Themes 内的子文
我正在编写一个使用虚拟树状文件结构的插件。基本上它就像一个包含文件的标准文件系统,区别在于这些文件实际上并不存在于文件系统中的特定位置,而只是 java 对象。 这些当前由使用 SettingProv
如果我在 XAML 中使用以下内容,我会收到错误消息: 错
我正在使用 laravel 资源来获取 api 的数据: return [ 'id' => $this->id, 'unread' =>
我有以下 pom.xml: 4.0.0 mycompany resource-fail 0.0.1-SNAPSHOT BazBat
许多GDI +类都实现IDisposable,但是我不确定何时应该调用Dispose。对于使用new或静态方法(例如Graphics.CreateGraphics)创建的实例来说,这很明显。但是,由属
我正在构建一组 RESTful 资源,其工作方式如下:(我将使用“people”作为示例): 获取/people/{key} - 返回一个人对象 (JSON) GET/people?first_nam
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一个使用 $resource 的简单 Controller : var Regions = $resource('mocks/regions.json'); $scope.regions =
在 Azure 门户中,如何查看不同资源之间的依赖关系。我特别想查看哪些资源正在使用我要删除的存储。 最佳答案 您可以使用应用程序洞察应用程序 map 来执行此操作: 您还可以打开存储帐户的日志记录:
我正在使用 ionic 生成资源(图标和启动画面)。我正在使用 ionic v2.1.0 和 cordova v6.4.0。 到目前为止我一直在使用(它在以前的版本中工作): cordova plat
是否可以使用 Assets 包含子文件夹中的文件? 示例:[base_url]/assets/css/pepper-grinder/jquery-ui-1.8.11.custom.min.css 最佳
我正在阅读一些尝试教授 Android 开发的书。在书中,作者概述了 res/下的一些目录。他提到 res/menu 包含基于 XML 的菜单规范。他还提到了保存“通用文件”的 res/raw。当我创
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我在服务器上使用 express-resource。在我的 AngularJS Controller 中: var User = $resource('/services/users/:use
因此,每当我运行我的应用程序时,它都会立即崩溃并给出以下错误: No package identifier when getting value for resource number 0x00000
对于我正在创建的(网络)应用程序,我需要使用基本身份验证在我的 UIWebView 中加载页面。 现在设置我使用的授权 header : NSString *result = [NSString st
我是一名优秀的程序员,十分优秀!