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 正则表达式(转义问题)
Dec 15 Python
Python实现简单HTML表格解析的方法
Jun 15 Python
python入门基础之用户输入与模块初认识
Nov 14 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
Sep 18 Python
Pycharm 创建 Django admin 用户名和密码的实例
May 30 Python
用Python实现读写锁的示例代码
Nov 05 Python
Python依赖包整体迁移方法详解
Aug 15 Python
Python 词典(Dict) 加载与保存示例
Dec 06 Python
python实现简单俄罗斯方块
Mar 13 Python
Python控制台实现交互式环境执行
Jun 09 Python
Python Process创建进程的2种方法详解
Jan 25 Python
Python 循环读取数据内存不足的解决方案
May 25 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
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
PHP自动重命名文件实现方法
2014/11/04 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
javascript 极速 隐藏/显示万行表格列只需 60毫秒
2009/03/28 Javascript
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
疯狂Jquery第一天(Jquery学习笔记)
2012/05/11 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
JS实现的随机排序功能算法示例
2017/06/09 Javascript
jQuery事件多次绑定与解绑问题实例分析
2019/02/19 jQuery
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
2020/05/29 jQuery
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
Python聚类算法之DBSACN实例分析
2015/11/20 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
pandas表连接 索引上的合并方法
2018/06/08 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
pyecharts在数据可视化中的应用详解
2020/06/08 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
AJax面试题
2014/11/25 面试题
办公室副主任岗位职责
2013/11/25 职场文书
社团成立邀请函
2014/01/08 职场文书
人事档案接收函
2014/01/12 职场文书
高三体育教学反思
2014/01/29 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
企业安全隐患排查治理制度
2015/08/05 职场文书
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript