python 线程池回收_python实现线程池

这段时间一直在做一个爬虫系统,用python和django实现。其中涉及到了多线程的问题,在后端使用一个全局的字典用来保存和识别已经运行的线程。但是觉得这样的实现不是不太舒服。于是想找到一个更好的实现,这就想到了线程池这个概念。

线程池的概念是什么?

在IBM文档库中这样的一段描写:“在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因。”--IBM文档库。

根据IBM文档中的描述,我理解为线程池是一个存放很多线程的单位,同时还有一个对应的任务队列。整个执行过程其实就是使用线程池中已有有限的线程把任务队列中的任务做完。这样做的好处就是你不需要为每个任务都创建一个线程,因为当你创建第100个线程来执行第100个任务的时候,可能前面已经有50个线程结束工作了。因此重复利用线程来执行任务,减少系统资源的开销。

一个不怎么恰当的比喻就是,有100台电脑主机箱需要从1楼搬到2楼,你不需要喊来100人帮忙搬,你只需要叫十个或者二十个人就足以,每个人分配十个或者五个甚至是谁搬的快谁就多搬知道完成未知。(这个比喻好像。。。。。)

不管如何吧,大体上理解了线程池的概念。那么怎么用python实现呢?我在网上找了一段代码,觉得不错,就收藏下来吧。贴上来大家瞧瞧。

# !/usr/bin/env python

# -*- coding:utf-8 -*-

# ref_blog:http://www.open-open.com/home/space-5679-do-blog-id-3247.html

import Queue

import threading

import time

class WorkManager(object):

def __init__(self, work_num=1000,thread_num=2):

self.work_queue = Queue.Queue()

self.threads = []

self.__init_work_queue(work_num)

self.__init_thread_pool(thread_num)

"""

初始化线程

"""

def __init_thread_pool(self,thread_num):

for i in range(thread_num):

self.threads.append(Work(self.work_queue))

"""

初始化工作队列

"""

def __init_work_queue(self, jobs_num):

for i in range(jobs_num):

self.add_job(do_job, i)

"""

添加一项工作入队

"""

def add_job(self, func, *args):

self.work_queue.put((func, list(args)))#任务入队,Queue内部实现了同步机制

"""

检查剩余队列任务

"""

def check_queue(self):

return self.work_queue.qsize()

"""

等待所有线程运行完毕

"""

def wait_allcomplete(self):

for item in self.threads:

if item.isAlive():item.join()

class Work(threading.Thread):

def __init__(self, work_queue):

threading.Thread.__init__(self)

self.work_queue = work_queue

self.start()

def run(self):

#死循环,从而让创建的线程在一定条件下关闭退出

while True:

try:

do, args = self.work_queue.get(block=False)#任务异步出队,Queue内部实现了同步机制

do(args)

self.work_queue.task_done()#通知系统任务完成

except Exception,e:

print str(e)

break

#具体要做的任务

def do_job(args):

print args

time.sleep(0.1)#模拟处理时间

print threading.current_thread(), list(args)

if __name__ == '__main__':

start = time.time()

work_manager = WorkManager(10, 2)#或者work_manager = WorkManager(10000, 20)

work_manager.wait_allcomplete()

end = time.time()

print "cost all time: %s" % (end-start)

比较网上其他的代码,我觉得这个代码还挺清晰易懂。

整个代码只有两个类:WorkManager和Work,前者确实如命名所示,是一个管理者,管理线程池和任务队列,而后者就是具体的一个线程。

它的整个运行逻辑就是,给WorkManager分配制定的任务量和线程数,然后每个线程都从任务队列中获取任务来执行,直到队列中没有任务。这里面也用到了Queue内部的同步机制(至于是啥同步机制目前还没去研究)。

总结一下这样一个线程池的作用,对于我本来的目的其实这个东西是永不上的,因为我需要在web页面来控制线程的启动和停止,而这个线程池看起来只是用来并发完任务的。不过我想虽然在控制线程方面没有作用,但是它的并发执行任务的作用还是蛮不错,或许可以用在爬网页的部分。

在进一步思考,或许我可以把WorkManager作为一个线程来运行,不过要怎么按需停止WorkManager内部线程池中线程的运行和停止呢。

----EOF-----

此文对我有价值,小额(无负担)赞助下^_^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

武汉大学计算机学院有什么实验室,武汉大学计算机学院实验室 - 安全牛课堂 - 领先的信息安全在线教育平台...

{"i18nChapterName": "章","i18nUnitName": "节","i18nLessonName": "课时","i18nTaskName":"任务"}{"text": {"icon": "es-icon es-icon-graphic","nam…

nHibernate Mapping By Code - Introduction

nHibernate 3.2新增了一种mapping by code的映射策略,很有意思。你可以自定义约定,并且按照约定定制自动映射策略,面对遗留数据库时这个功能往往很有用,另外,由于mapping by code是基于代码的(而不是xml文件…

android绘制环形进度_Android动态自定义圆形进度条

这篇文章主要介绍了Android动态自定义圆形进度条,需要的朋友可以参考下效果图:A.绘制圆环,圆弧,文本//1.画圆环//原点坐标float circleX width / 2;float circleY width / 2;//半径float radius width / 2 - roundWidth / 2;//设置画笔的属…

2014全国计算机二级vfp模拟试题和答案,2014年全国计算机二级考试VF模拟试题

2014年全国计算机二级考试VF模拟试题选择题(1)下列数据结构中,属于非线性结构的是(  )。A)带链队列B)循环队列C)带链栈D)二叉树(2)下列叙述中正确的是(  )。A)数据的逻辑结构与存储结构是一一对应的B)算法的时间复杂度与空间复杂度一定相关C)算法的.效率只与问题…

一个自动生成关键字索引页面的比处理文件

电脑上资料多了之后,每次找资料很麻烦。因此,匠人写了这个批处理文件。1、把这个批处理文件放在资料目录。2、执行它,输入关键字。它回自动搜索整个目录以及下属目录中的所有文件名中包含该关键字的文件,并生成一个带超级连接的网…

指令 出厂_口碑营销_南澳出口木箱出厂价

口碑营销_南澳出口木箱出厂价 z1m0b1ch口碑营销_南澳出口木箱出厂价 无熏蒸有效期时间限制。拆装方便,由于钢带木箱采用的是钢边连接,因此极大的节省了运输成本,节约了储存空间,对吨以下的货物运输非常适合。而且由于钢边连接&…

j计算机实验室安全操作规范,实验室安全操作规程

与《实验室安全操作规程》相关的范文实验室安全使用操作规程 化学实验室安全使用操作规程 在中学化学实验中,使用的仪器、装置大部分是容易破碎的玻璃器皿,许多药品都是可燃、易爆、有腐蚀性或有毒的危险品,实验过程中常常需要用明火加热。因…

前端学习(498):水平居中布局得第一种方式

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>居中布局一</title><style>.parent{wid…

和合符放枕头下的作用_深度解析:记忆棉枕头好,还是乳胶枕头好?

记忆棉枕头和乳胶枕头哪种好&#xff0c;并不能一概一论&#xff0c;要根据个人用枕需求来确定。首先&#xff0c;我们来了解一下它们本质上的区别&#xff0c;顾名思义&#xff0c;它们的本质区别就是材质&#xff0c;从手感上来说&#xff0c;乳胶材质在触感上会比记忆棉更加…

能够关闭并退出计算机程序的是,电脑强制关闭程序按哪三个键 可按Alt+F4关闭当前页面...

导读&#xff1a;说到程序&#xff0c;大多数人都知道&#xff0c;有人问电脑突然死机强制关机打不开&#xff0c;还有朋友想问电脑强制关闭程序按哪三个键&#xff0c;这到底是咋回事&#xff1f;事实上电脑qq怎么强制关闭呢&#xff0c;今天小编给大家整理了电脑强制关闭程序…

前端学习(499):水平居中布局得第一种方式得优点和缺点

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>居中布局一</title><style>.parent{wid…

乒乓球单循环赛_重庆市首届乒乓球业余锦标赛开拍 冠军奖3万 总奖金近10万

上游新闻重庆晚报慢新闻记者 赵映骥 文 /图今天(20日)上午&#xff0c;大田湾体育馆迎来了又一项重磅赛事&#xff1a;重庆市首届泽九杯乒乓球业余锦标赛正式开拍&#xff0c;在为期三天的比赛中&#xff0c;邮电大学超越队、重庆烟草队等35支代表队、近百名乒乓球爱好者&#…

js 作用域

Javascript中的函数“在定义它们的作用域里运行&#xff0c;而不是在执行它们的作用域里运行”。 var tt aa; function test(){ alert(tt); var tt dd; alert(tt); } test(); 执行结果&#xff1a;undefined和dd test函数内部的“var ttdd”将会致使“var ttaa”在test函数被…

计算机组成原理实...,计算机组成原理实报告-杨睿.doc

计算机组成原理实报告-杨睿TH-union教学实验计算机系统实验报告学 院&#xff1a; 信息学院姓 名&#xff1a; 杨睿班 级&#xff1a; 计算机1101B学 号&#xff1a; 2011080332117指导老师&#xff1a; 李天工北京联合大学教务处编印实验一&#xff1a;TH-union教学实验计算机…

前端学习(500):水平居中布局得第二种方式

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>居中布局一</title><style>.parent{wid…

swagger 修改dto注解_Swagger介绍及使用

Swagger介绍及使用导语&#xff1a;相信无论是前端还是后端开发&#xff0c;都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力&#xff0c;经常来不及更新。其实无论是前端调用后端&#xff0c;还是后…

注册和登录还有那个加密的密码

假设你在设计自己的系统的时候采用的是MVC架构。例如 也许可能有很多童鞋会这样设计Service和Model. service: public class AccountService { public bool Login(string userName, string password) { // insert into account values(userName,password); …