WEB开发网
开发学院软件开发C语言 浅谈线程池(中):独立线程池的作用及IO线程池 阅读

浅谈线程池(中):独立线程池的作用及IO线程池

 2010-09-30 20:49:16 来源:WEB开发网   
核心提示: 不过事实上,使用Windows API编写IOCP非常复杂,浅谈线程池(中):独立线程池的作用及IO线程池(4),而在.NET中,由于需要迎合标准的APM(异步编程模型),如果它真的成为影响性能的关键因素之一,我们就可能需要使用Native Code来调用IOCP相关API,在使用方便的同时也放

不过事实上,使用Windows API编写IOCP非常复杂。而在.NET中,由于需要迎合标准的APM(异步编程模型),在使用方便的同时也放弃一定的控制能力。因此,在一些真正需要高吞吐量的时候(如编写服务器),不少开发人员还是会选择直接使用Native Code编写相关代码。不过在绝大部分的情况下,.NET中利用IOCP的异步IO操作已经足以获得非常优秀的性能了。使用APM方式在.NET中使用异步IO非常简单,如下:

static void Main(string[] args)  
{  
    WebRequest request = HttpWebRequest.Create("http://www.cnblogs.com");  
    request.BeginGetResponse(HandleAsyncCallback, request);  
}  
 
static void HandleAsyncCallback(IAsyncResult ar)  
{  
    WebRequest request = (WebRequest)ar.AsyncState;  
    WebResponse response = request.EndGetResponse(ar);  
    // more operations...  
}

BeginGetResponse 将发起一个利用IOCP的异步IO操作,并在结束时调用HandleAsyncCallback回调函数。那么,这个回调函数是由哪里的线程执行的呢?没错,就是传说中“IO线程池”的线程。.NET在一个进程中准备了两个线程池,除了上篇文章中所提到的CLR线程池之外,它还为异步IO操作的回调准备了一个IO线程池。IO线程池的特性与CLR线程池类似,也会动态地创建和销毁线程,并且也拥有最大值和最小值(可以参考上一篇文章列举出的API)。

只可惜,IO线程池也仅仅是那“一整个”线程池,CLR线程池的缺点IO线程池也一应俱全。例如,在使用异步IO方式读取了一段文本之后,下一步操作往往是对其进行分析,这就进入了计算密集型操作了。但对于计算密集型操作来说,如果使用整个IO线程池来执行,我们无法有效的控制某项任务的运算能力。因此在有些时候,我们在回调函数内部会把计算任务再次交还给独立的线程池。这么做从理论上看会增大线程调度的开销,不过实际情况还得看具体的评测数据。如果它真的成为影响性能的关键因素之一,我们就可能需要使用Native Code来调用IOCP相关API,将回调任务直接交给独立的线程池去执行了。

上一页  1 2 3 4 5  下一页

Tags:线程 独立 线程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接