Python实现线程池代码分享


Posted in Python onJune 21, 2015

原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码

import threading
import time
import signal
import os
 
class task_info(object):
  def __init__(self):
    self.func = None
    self.parm0 = None
    self.parm1 = None
    self.parm2 = None
   
class task_list(object):
  def __init__(self):
    self.tl = []
    self.mutex = threading.Lock()
    self.sem = threading.Semaphore(0)
   
  def append(self, ti):
    self.mutex.acquire()
    self.tl.append(ti)
    self.mutex.release()
    self.sem.release()
   
  def fetch(self):
    self.sem.acquire()
    self.mutex.acquire()
    ti = self.tl.pop(0)    
    self.mutex.release()
    return ti
   
class thrd(threading.Thread):
  def __init__(self, tl):
    threading.Thread.__init__(self)
    self.tl = tl
   
  def run(self):
    while True:
      tsk = self.tl.fetch()
      tsk.func(tsk.parm0, tsk.parm1, tsk.parm2)  
 
class thrd_pool(object):
  def __init__(self, thd_count, tl):
    self.thds = []
     
    for i in range(thd_count):
      self.thds.append(thrd(tl))
   
  def run(self):
    for thd in self.thds:
      thd.start()
       
       
def func(parm0=None, parm1=None, parm2=None):
  print 'count:%s, thrd_name:%s'%(str(parm0), threading.currentThread().getName())
   
def cleanup(signo, stkframe):
  print ('Oops! Got signal %s', signo) 
   
  os._exit(0)
   
if __name__ == '__main__':
   
  signal.signal(signal.SIGINT, cleanup)
  signal.signal(signal.SIGQUIT, cleanup)
  signal.signal(signal.SIGTERM, cleanup)
   
  tl = task_list()
  tp = thrd_pool(6, tl)
  tp.run()
   
  count = 0
  while True:
     
    ti = task_info()
    ti.parm0 = count
    ti.func = func
    tl.append(ti)
    count += 1
     
    time.sleep(2)
  pass
Python 相关文章推荐
举例讲解Python面向对象编程中类的继承
Jun 17 Python
对python过滤器和lambda函数的用法详解
Jan 21 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 Python
Python迷宫生成和迷宫破解算法实例
Dec 24 Python
pyinstaller还原python代码过程图解
Jan 08 Python
使用Python制作新型冠状病毒实时疫情图
Jan 28 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
python实现密码验证合格程序的思路详解
Jun 01 Python
详解python的super()的作用和原理
Oct 29 Python
python+selenium实现12306模拟登录的步骤
Jan 21 Python
python中mongodb包操作数据库
Apr 19 Python
Python os模块学习笔记
Jun 21 #Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 #Python
Python实现删除文件但保留指定文件
Jun 21 #Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
Jun 21 #Python
让Python代码更快运行的5种方法
Jun 21 #Python
Python文件读取的3种方法及路径转义
Jun 21 #Python
Python多线程和队列操作实例
Jun 21 #Python
You might like
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
2012/02/05 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
MSN消息提示类
2006/09/05 Javascript
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
node.js 使用ejs模板引擎时后缀换成.html
2015/04/22 Javascript
分享一些常用的jQuery动画事件和动画函数
2015/11/27 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
4 种滚动吸顶实现方式的比较
2019/04/09 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
Python中subprocess模块用法实例详解
2015/05/20 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
如何用用Python将地址标记在地图上
2021/02/07 Python
.NET笔试题(20个问题)
2016/02/02 面试题
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
千万级用户系统SQL调优实战分享
2022/03/03 MySQL