范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

一个高频问题异步操作会创建线程吗?

  这个问题在微信上被别人问过好多次,想来想去觉得有必要统一解答下,先说下我的答案: 可能会,也有可能不会 。
  要想寻找答案,需要从  异步处理   的底层框架说起。一:异步底层是什么
  异步   从设计层面上来说它就是一个 发布订阅者   模式,毕竟它的底层用到了 端口完成队列  ,可以从 IO完成端口内核对象   所提供的三个方法中有所体现。CreateIoCompletionPort
  可以粗看下签名:  HANDLE WINAPI CreateIoCompletionPort(   _In_     HANDLE    FileHandle,   _In_opt_ HANDLE    ExistingCompletionPort,   _In_     ULONG_PTR CompletionKey,   _In_     DWORD     NumberOfConcurrentThreads );
  这个方法主要是将  文件句柄   和 IO完成端口内核对象   进行绑定,其中的 NumberOfConcurrentThreads   表示完成端口最多允许 running 的线程上限。PostQueuedCompletionStatus
  再看签名:  BOOL WINAPI PostQueuedCompletionStatus(   _In_     HANDLE       CompletionPort,   _In_     DWORD        dwNumberOfBytesTransferred,   _In_     ULONG_PTR    dwCompletionKey,   _In_opt_ LPOVERLAPPED lpOverlapped );
  这个函数的作用就是将一个  包   通过 内核对象   丢给 驱动设备程序   ,由后者与硬件交互,比如文件  。GetQueuedCompletionStatus
  看签名:  BOOL GetQueuedCompletionStatus(   [in]  HANDLE       CompletionPort,         LPDWORD      lpNumberOfBytesTransferred,   [out] PULONG_PTR   lpCompletionKey,   [out] LPOVERLAPPED *lpOverlapped,   [in]  DWORD        dwMilliseconds );
  这个方法尝试从  IO完成端口内核对象   中提取 IO 包,如果没有提取到,那么就会无限期等待,直到提取为止。
  对上面三个方法有了概念之后,接下来看下结构图:
  这张图非常言简意赅,不过只画了  端口完成队列  , 其实还有三个与IO线程有关的队列,分别为:等待线程队列  , 已释放队列  , 已暂停队列  ,接下来我们稍微解读一下。
  当  线程t1   调用 GetQueuedCompletionStatus   时,假使此刻 任务队列q1   无任务, 那么 t1   会卡住并自动进去 等待线程队列   ,当某个时刻 q1   进了任务(由驱动程序投递的),此时操作系统会将 t1   激活来提取 q1   的任务执行,同时将 t1   送到已释放队列  中。
  这个时候就有两条路了。 遇到 Sleep 或者 lock 情况。
  如果 t1 在执行的时候,遇到了  Sleep   或者 lock   锁时需要被迫停止,此时系统会将 t1 线程送到 已暂停线程队列   中,如果都 sleep 了,那 NumberOfConcurrentThreads   就会变为 0 ,此时就会遇到无人可用的情况,那怎么办呢?只能让系统从 线程池   中申请更多的线程来从 q1   队列中提取任务,当某个时刻, 已暂停线程队列   中的线程激活,那么它又回到了 已释放队列   中继续执行任务,当任务执行完之后,再次调用 GetQueuedCompletionStatus   方法进去 等待线程队列  。
  当然这里有一个问题,某一个时刻  等待线程队列   中的线程数会暂时性的超过 NumberOfConcurrentThreads   值,不过问题也不大。
  说了这么多理论是不是有点懵, 没关系,接下来我结合 windbg 和 coreclr 源码一起看下。
  以我的机器来说, IO完成端口内核对象   默认最多允许 12   个 running 线程,当遇到 sleep 时看看会不会突破 12   的限制,上代码:     class Program     {         static void Main(string[] args)         {             for (int i = 0; i < 2000; i++)             {                 Task.Run(async () =>                 {                     await GetString();                 });             }              Console.ReadLine();         }          public static int counter = 0;          static async Task GetString()         {             var httpClient = new HttpClient();              var str = await httpClient.GetStringAsync("http://cnblogs.com");              Console.WriteLine(#34;counter={++counter}, 线程:{Thread.CurrentThread.ManagedThreadId},str.length={str.Length}");              Thread.Sleep(1000000);              return str;         }     }
  从图中看,已经破掉了  12   的限制,那是不是 30 呢? 可以用 windbg 帮忙确认一下。 0:059> !tp CPU utilization: 3% Worker Thread: Total: 13 Running: 0 Idle: 13 MaxLimit: 2047 MinLimit: 12 Work Request in Queue: 0 -------------------------------------- Number of Timers: 1 -------------------------------------- Completion Port Thread:Total: 30 Free: 0 MaxFree: 24 CurrentLimit: 30 MaxLimit: 1000 MinLimit: 12
  从最后一行看,没毛病,  IO完成端口线程   确实是 30   个。
  在这种情况,异步操作一定会创建线程来处理 遇到耗时操作
  所谓的耗时操作,大体上是大量的序列化,复杂计算等等,这里我就用  while(true)   模拟,因为所有线程都没有遇到暂停事件,所以理论上不会突破 12   的限制,接下来稍微修改一下 GetString()   方法。         static async Task GetString()         {             var httpClient = new HttpClient();              var str = await httpClient.GetStringAsync("http://cnblogs.com");              Console.WriteLine(#34;counter={++counter},时间:{DateTime.Now}, 线程:{Thread.CurrentThread.ManagedThreadId},str.length={str.Length}");              while (true) { }              return str;         }
  对比图中的时间,过了30s也无法突破 12 的限制,毕竟这些线程都是 running 状态并都在  已释放队列  中,这也就造成了所谓的 请求无响应   的尴尬情况。二:直面问题
  如果明白了上面我所说的,那么  异步操作会不会创建线程 ?   问题,我的答案是 有可能会也有可能不会  ,具体还是取决于上面提到了两种 callback 逻辑。
  本文来自https://www.cnblogs.com/huangxincheng/p/16085461.html

一旦苹果真的撤出中国市场会怎样?来了欢迎,走了不送,觉得苹果好就买,不好买别的。苹果走了很快就会有别的代替,桃子,杏子,哈密瓜,鸭梨,芒果,莲雾,菠萝蜜无花果,这里生活安定,物资丰富,市场繁荣,想要挟中国人民,作亚马逊卖家运营日常做什么我接触了很多个人亚马逊卖家,他们和佛系,有活就干,没活就出去玩也有很多公司卖家他们推新品就很忙,平时就很闲。那么有人问我,我不想这么闲着,也不想突然工作那么累,我们该怎么安排工作。国家网信办拟规定不得通过机器或人工方式刷榜控评来源人民日报客户端记者获悉,国家互联网信息办公室对2016年8月1日正式施行的移动互联网应用程序信息服务管理规定进行了修订,并1月5日向社会公开征求意见。征求意见稿规定,应用程序提数字人民币(试点版)正式上线,如何使用微信支付?下载之后,开通微众银行(微信支付)数字人民币钱包,并且实名升级到二级钱包,在微信钱包页面就会出现数字人民币模块,输入手机号验证码,就可以完成关联。关联以后在微信付款码可以一键切换到芒果TV和湖南卫视是什么关系?看了几个人回答,都不对。我曾经在芒果TV工作过,我来回答这个问题!芒果TV和湖南卫视都属于湖南广电,湖南卫视是传统电视媒体属性,芒果TV是互联网媒体属性!芒果TV前身是金鹰网,在视天猫淘宝大调整,阿里巴巴走出困境迈向新阶段的里程碑阿里巴巴多元化体系中核心是中国数字商业板块(戴珊负责)和海外数字商业板块(蒋凡负责),戴珊和蒋凡位置对调的同时手下得力干将也同时调整。中国数字商业板块大淘宝(天猫淘宝阿里妈妈)淘特新换的手机电池什么体验?超长续航能力自从我开学之后我发现我的手机充满电之后待机时间越来越短了,我几乎每天早上在宿舍充满电,到教室大概中午就只剩百分之二十的电量了,而在这中间我顶多也只是偶尔拿出手机回复微信和拍ppt而德尔塔奥密克戎?25人已感染据以色列耶路撒冷邮报9日援引塞浦路斯媒体报道,塞浦路斯大学研究人员疑似在当地发现一种德尔塔与奥密克戎的重组新冠毒株,其基因与德尔塔毒株更为接近,但拥有大量奥密克戎毒株的特有变异。因荣耀60Pro一台不做性能却把其他方面做到最好的手机说到荣耀,可能有很多人都知道他最初是华为推出来和小米打持久战的,可从华为哪里独立品牌出去后,它越来越像多年前的ov。一台手机并不是只看性能,所以荣耀60Pro它来了。荣耀60Pro贾跃亭的乐视手机低价高配,为什么现在已经很少有人购买了?贾跃亭的乐视手机低价高配,为什么现在已经很少有人购买了?乐视目前上架的S1手机在配置上是很高的,比如在像素上,乐视S1的像素为4800万,核心数为8核,CPU频率2。0GHz,运行双毒合一?塞浦路斯研究人员称发现德尔塔克戎毒株科技日报记者胡定坤实习记者于紫月据以色列耶路撒冷邮报9日援引塞浦路斯媒体报道,塞浦路斯大学研究人员疑似在当地发现一种德尔塔与奥密克戎的重组新冠毒株,其基因与德尔塔毒株更为接近,但拥
湖北崇阳快递,成立4通1达,5家合一家,算不算在垄断快递行业?不算,有一个词语叫身兼数职。1。从法律上来讲不算,毕竟除了四通一达,还有德邦,顺丰,邮政,京东,极兔,天天等等很多家快递和物流公司。尤其是自营的德邦,邮政,价格也没贵到哪去。2。人小米MIX2已经用三年多了,能顶到mix4吗?千万不能换4,你想你管了4就没钱了,没钱就吃不上饭了,吃不上饭就工作不了,你不工作公司就倒闭了,公司倒闭就不能纳税了,没有税收国家财政就会产生危机,国家财政危机会引起世界金融动荡,荣耀50再次确定,背部设计很惹眼,售价也感人要说目前大家最关心的手机新品,就是荣耀50系列了,关于这款产品,已经有很多爆料消息出现。而就在刚刚,笔者也收到了荣耀50系列新机的最新爆料,这次是它的机身背面设计。简单的讲,就是荣腾讯出资打造Win10掌机11代酷睿2K屏售价上万虽然拿下了任天堂Switch掌机的国行代理,但腾讯在掌机游戏市场上似乎并没有放弃自研的野心,由他们出资赞助开发的Win10掌机ONEXPLAYER日前开始众筹,不到一天时间就获得了补贴后售价16。28万几何C版灵感紫上市生活就该酱紫几何汽车在4月中旬就启动的春日换装计划。日前,几何汽车官方发布了几何C甄选续航版C版灵感紫,补贴后售价16。28万,NEDC续航550公里,新车最大的亮点是采用了充满个性的灵感紫涂爱普生推出首款搭载腾讯视频极光TV的智能投影机,售价4999元起5月10日,腾讯视频与爱普生举行主题为声色合和投号玩家的新品发布会。会上,正式发布了全球首款搭载腾讯视频极光TV的3LCD智能激光投影和激光电视产品。目前,这三款产品已在电商平台上小米平板超大杯公布11寸高刷屏骁龙870除了小米的手机系列产品之外,今年将要复活的小米平板也牵动着很多米粉的心。据数码闲聊站今天带来的爆料信息显示,小米平板5系列已经正式入网了,而且是上个月就已经完成了备案,其中除了标准与宁德时代携手发展新能源电动船,亚光科技大涨12周四早盘,亚光科技高开高走,截至发稿,该股大涨超12,报9。24元。5月12日,亚光科技公告,公司与宁德时代签署合作协议,双方将在新能源电动船领域展开合作,包括游艇游览船公务船等的中通客车获巴基斯坦百辆新能源公交车订单来源中国交通新闻网本网讯近日,中通客车传来喜讯,成功中标巴基斯坦卡拉奇市100辆18米新能源公交车订单,这将是卡拉奇市首批新能源公交车。卡拉奇是巴基斯坦第一大城市,被称为巴基斯坦的程序员用Mac都有哪些必备的app?Mac上程序员必备的10大软件1IDEA作为一个开发者,必须使用IDEA的,以前的elipse基本很少有用了,除非那些10多年的老员工对它有太大的感情了。2安装JDK11或者JDK你认为耳机行业接下来的发展趋势是什么?欢迎关注中关村在线。这8个关键词带你了解耳机行业的变化。2018年是耳机行业高速发展的一年,随着大量手机取消耳机孔,以及流媒体音乐的崛起,有线耳机市场日渐式微,无线蓝牙耳机的兴起为