首页 > 编程语言 >python线程池设计

python线程池设计

时间:2023-04-25 20:32:19浏览次数:43  
标签:管理器 请求 python 创建 队列 线程 服务器 设计


什么是线程池?

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

线程池是预先创建线程的一种技术。线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中。这些线程都是处于睡眠状态,即均为启动,不消耗CPU,而只是占用较小的内存空间。当请求到来之后,缓冲池给这次请求分配一个空闲线程,把请求传入此线程中运行,进行处理。当预先创建的线程都处于运行状态,即预制线程不够,线程池可以自由创建一定数量的新线程,用于处理更多的请求。当系统比较闲的时候,也可以通过移除一部分一直处于停用状态的线程。

线程池的注意事项

虽然线程池是构建多线程应用程序的强大机制,但使用它并不是没有风险的。在使用线程池时需注意线程池大小与性能的关系,注意并发风险、死锁、资源不足和线程泄漏等问题。

(1)线程池大小。多线程应用并非线程越多越好,需要根据系统运行的软硬件环境以及应用本身的特点决定线程池的大小。一般来说,如果代码结构合理的话,线程数目与CPU 数量相适合即可。如果线程运行时可能出现阻塞现象,可相应增加池的大小;如有必要可采用自适应算法来动态调整线程池的大小,以提高CPU 的有效利用率和系统的整体性能。

(2)并发错误。多线程应用要特别注意并发错误,要从逻辑上保证程序的正确性,注意避免死锁现象的发生。

(3)线程泄漏。这是线程池应用中一个严重的问题,当任务执行完毕而线程没能返回池中就会发生线程泄漏现象。

简单线程池的设计

一个典型的线程池,应该包括如下几个部分:
1、线程池管理器(ThreadPool),用于启动、停用,管理线程池
2、工作线程(WorkThread),线程池中的线程
3、请求接口(WorkRequest),创建请求对象,以供工作线程调度任务的执行
4、请求队列(RequestQueue),用于存放和提取请求
5、结果队列(ResultQueue),用于存储请求执行后返回的结果

线程池管理器,通过添加请求的方法(putRequest)向请求队列(RequestQueue)添加请求,这些请求事先需要实现请求接口,即传递工作函数、参数、结果处理函数、以及异常处理函数。之后初始化一定数量的工作线程,这些线程通过轮询的方式不断查看请求队列(RequestQueue),只要有请求存在,则会提取出请求,进行执行。然后,线程池管理器调用方法(poll)查看结果队列(resultQueue)是否有值,如果有值,则取出,调用结果处理函数执行。通过以上讲述,不难发现,这个系统的核心资源在于请求队列和结果队列,工作线程通过轮询requestQueue获得人物,主线程通过查看结果队列,获得执行结果。因此,对这个队列的设计,要实现线程同步,以及一定阻塞和超时机制的设计,以防止因为不断轮询而导致的过多cpu开销。在本文中,将会用python语言实现,python的Queue,就是很好的实现了对线程同步机制。

python线程池设计_线程池



 

标签:管理器,请求,python,创建,队列,线程,服务器,设计
From: https://blog.51cto.com/u_16088628/6225043

相关文章

  • 原型设计工具比较及实践
    墨刀适用领域: 墨刀是一款在线原型设计与协同工具,借助墨刀,产品经理、设计师、开发、销售、运营及创业者等用户群体,能够搭建为产品原型,演示项目效果。墨刀同时也是协作平台,项目成员可以协作编辑、审阅,不管是产品想法展示,还是向客户收集产品反馈,向投资人进行Demo展示,或是在团队内部......
  • Python Selenium搭建UI自动化测试框架
    自动化测试是软件测试中非常重要的一部分,可以提高测试效率和测试覆盖率。在UI自动化测试中,Selenium是非常流行的工具。本文将介绍如何使用Python和Selenium搭建UI自动化测试框架。一、环境准备在开始搭建UI自动化测试框架之前,需要先安装Python和Selenium。可以从Python官网下载P......
  • DNF韩服手游脚本概要设计
    背景当角色到达65级之后,主要的工作就是凑装备,强化,打造词条,附魔等细节。其中投入最大,周期最长的就是强化了,从15到16保底至少需要500万泰拉,到20就更遥不可及,除了活动能够加快一些进度,主要就是靠【搬砖】。这篇文章旨在解决【搬砖的枯燥】与【人类对美好生活向往】之间的矛盾。毛......
  • 原型设计工具比较及实践
    原型设计工具比较及实践 目录·原型设计工具比较    ·墨刀    ·Axure   ·Mockplus·原型设计    ·主题名称    ·功能以及界面设计及考虑因素   ·切换界面    ·界面切换流程  一,原型设计工具比较1.墨刀·适用邻域 ......
  • 原型设计工具比较及实践
    目录 一.原型设计工具比较 1.墨刀      适用领域      优点      缺点  2.Axure      适用领域      优点      缺点 3.Mockplus      适用领域      优......
  • 安装python
    1.ubautu系统sudoapt-getinstallpython2.7sudoapt-getinstallpython3 卸装sudoapt-getremovepython3卸载Python3.6及其依赖sudoapt-getremove--auto-removepython3.6 3.将python命令映射到python3sudoaptinstallpython-is-python3 ......
  • Python模拟动态星空
    文章目录前言一、模拟星空总结前言今天,我们来用Python做个星空。一、模拟星空1,.首先导入所需要的库:fromturtleimport*fromrandomimportrandom,randint2.初始画面:screen=Screen()width,height=800,600screen.setup(width,height)screen.title('模拟3D星空')scre......
  • 【NLP教程】用python调用百度AI开放平台进行情感倾向分析
    目录一、背景二、操作步骤2.1创建应用2.2获取token2.3情感倾向分析三、其他情感分析四、讲解视频一、背景Hi,大家!我是@马哥python说,一名10年程序猿。今天我来演示一下:通过百度AI开放平台,利用python调用百度接口进行中文情感倾向分析,并得出情感极性分为积极、消极还是中性以......
  • 多线程-从os层面理解常见概念
    如何创建一个线程在Linux系统中有一个方法,他有四个参数,其中第一个参数是利用指针传入,后期如果被修改也会同步修改,第三个参数和自己定义的run方法有关,后面会详细说。intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),vo......
  • 多线程批量解压
    importthreadingimporttimeimportosimporttarfileinput_path=r"D:\jieyaqian"out=r'D:\jieyahou'classs=os.listdir(input_path)defrepress(folder,input_path,out):print(1,folder)ori_tif=os.path.join(input_......