当前位置:
首页 > Python基础教程 >
-
python线程池进一步认识
线程池的概念是什么?
在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些 很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因。
我理解为线程池是一个存放很多线程的单位,同时还有一个对应的任务队列。整个执行过程其实就是使用线程池中已有有限的线程把任务 队列中的任务做完。这样做的好处就是你不需要为每个任务都创建一个线程,因为当你创建第100个线程来执行第100个任务的时候,可能前面已经有50个线 程结束工作了。因此重复利用线程来执行任务,减少系统资源的开销。
一个不怎么恰当的比喻就是,有100台电脑主机箱需要从1楼搬到2楼,你不需要喊来100人帮忙搬,你只需要叫十个或者二十个人就足以,每个人分配十个或者五个甚至是谁搬的快谁就多搬知道完成未知。(这个比喻好像。。。。。)
不管如何吧,大体上理解了线程池的概念。那么怎么用python实现呢?
代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
# !/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) |
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式