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系列之浅谈pickle模块封装和拆封数据对象的方法
May 23 Python
python常见数制转换实例分析
May 09 Python
python实现批量修改文件名代码
Sep 10 Python
Python实现时钟显示效果思路详解
Apr 11 Python
Selenium(Python web测试工具)基本用法详解
Aug 10 Python
浅析python3字符串格式化format()函数的简单用法
Dec 07 Python
Python将json文件写入ES数据库的方法
Apr 10 Python
Python变量访问权限控制详解
Jun 29 Python
keras自定义损失函数并且模型加载的写法介绍
Jun 15 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
Aug 02 Python
Django REST framework 限流功能的使用
Jun 24 Python
Python机器学习实战之k-近邻算法的实现
Nov 27 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
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
Thinkphp微信公众号支付接口
2016/08/04 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
Python的Django框架安装全攻略
2015/07/15 Python
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
python实现单向链表详解
2018/02/08 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
2018/11/07 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
树莓派极简安装OpenCv的方法步骤
2019/10/10 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
python一些性能分析的技巧
2020/08/30 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
html5菜单折纸效果
2014/04/22 HTML / CSS
戴森英国官网:Dyson英国
2019/05/07 全球购物
生态学毕业生自荐信
2013/10/27 职场文书
关于爱国的标语
2014/06/24 职场文书
小学三好学生事迹材料
2014/08/15 职场文书
创先争优演讲稿
2014/09/15 职场文书
餐饮服务食品安全承诺书
2015/04/29 职场文书
公司考勤管理制度
2015/08/04 职场文书
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL
Windows Server 2012 修改远程默认端口3389的方法
2022/04/28 Servers