线程池的研究及实现

线程池的研究及实现

ID:45618692

大小:123.16 KB

页数:16页

时间:2019-11-15

线程池的研究及实现_第1页
线程池的研究及实现_第2页
线程池的研究及实现_第3页
线程池的研究及实现_第4页
线程池的研究及实现_第5页
资源描述:

《线程池的研究及实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、什么是线程池?诸如web服务器、数据库服务器、文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务。构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就创建一个新的服务对彖,然后在新的服务对彖屮为请求服务。但当有大量请求并发访问时,服务器不断的创建和销毁对彖的开销很大。所以提高服务器效率的一个手段就是尽可能减少创建和销毁对彖的次数,特别是一些很耗资源的对彖创建和销毁,这样就引入了“池”的概念,“池”的概念使得人们可以定制一定量的资源,然后对这些资源进行复用,而不是频繁的创建和销毁。线程池是预先创建线程的一种技术。线程池在还没有任务到来Z前,创建

2、一定数量的线程,放入空闲队列屮。这些线程都是处于睡眠状态,即均为启动,不消耗CPU,而只是占用较小的内存空间。当请求到来Z后,缓冲池给这次请求分配一个空闲线程,把请求传入此线程屮运行,进行处理。当预先创建的线程都处于运行状态,即预制线程不够,线程池可以自由创建一定数量的新线程,用于处理更多的请求。当系统比较闲的时候,也可以通过移除一部分一直处于停用状态的线程。线程池的注意事项虽然线程池是构建多线程应用程序的强大机制,但使用它并不是没有风险的。在使用线程池时需注意线程池大小与性能的关系,注意并发风险、死锁、资源不足和线程泄漏等问题。(1)线程池大小。多线程应用并非线程越多越好,需要

3、根据系统运行的软硬件环境以及应用木身的特点决定线程池的大小。一般来说,如果代码结构合理的话,线程数口与CPU数量相适合即可。如果线程运行吋可能出现阻塞现象,可相应增加池的大小;如有必要可采用自适应算法来动态调整线程池的大小,以提高CPU的右效利用率和系统的整体性能。(1)并发错误。多线程应用要特别注意并发错误,要从逻辑上保证程序的正确性,注意避免死锁现象的发生。(2)线程泄漏。这是线程池应用屮一个严重的问题,当任务执行完毕而线程没能返冋池屮就会发生线程泄漏现象。简单线程池的设计一个典型的线程池,应该包括如下几个部分:1、线程池管理器(ThreadPool),用于启动、停用,管理线

4、程池2、工作线程(WorkThread),线程池中的线程3、请求接口(WorkRequest),创建请求对象,以供工作线程调度任务的执行4、请求队列(RequestQueue),用于存放和提取请求5、结杲队列(ResultQueue),用于存储请求执行后返回的结杲线程池管理器,通过添加请求的方法(putRequest)向请求队列(RequestQueue)添加请求,这些请求事先需要实现请求接口,即传递工作函数、参数、结果处理函数、以及异常处理函数。Z后初始化一定数量的工作线程,这些线程通过轮询的方式不断查看请求队列(RequestQueue),只要有请求存在,则会提取出请求,进行

5、执行。然后,线程池管理器调用方法(poll)查看结果队列(resultQueue)是否有值,如果有值,则取出,调用结果处理函数执行。通过以上讲述,不难发现,这个系统的核心资源在于请求队列和结果队列,工作线程通过轮询requestQueue获得人物,主线程通过查看结果队列,获得执行结果。因此,对这个队列的设计,要实现线程同步,以及一定阻塞和超时机制的设计,以防止因为不断轮询而导致的过多cpu开销。在本文屮,将会用python语言实现,python的Queue,就是很好的实现了对线程同步机制。使用Python实现:#-*-encoding:utf-8-*-,),Createdon20

6、12-3-9©summary:线程池@contact:mai1to:zhanglixinscu@gmai1.com@author:zhanglixin,),importsysimportthreadingimportQueueimporttraccback#定义一些Exception,用于口定义异常处理classNoRcsultsPcnding(Exccption):"""AllworksrequestshavebeenprocessedpassclassNoWorkersAvailablc(Exccption):worketthreadsavailabletoprocessrc

7、mainingrequests.passdef_handle_thread_exception(request,exc_info):〃〃〃默认的异常处理函数,只是简单的打印〃"traccback.printcxccption(*cxcinfo)ttclasscsclassWorkcrThrcad(threading.Thread):""后台线程,真正的工作线程,从请求队列(rcqucstQucuc)屮获取work,并将执行后的结果添加到结果队列(rcsultQueue)/,/,/

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。