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基础语法(Python基础知识点)
Feb 28 Python
Python模块包中__init__.py文件功能分析
Jun 14 Python
Python中异常重试的解决方案详解
May 05 Python
matplotlib绘制动画代码示例
Jan 02 Python
Python学习之Anaconda的使用与配置方法
Jan 04 Python
python批量解压zip文件的方法
Aug 20 Python
python中利用matplotlib读取灰度图的例子
Dec 07 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
Jan 15 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
Apr 20 Python
python实点云分割k-means(sklearn)详解
May 28 Python
Python页面加载的等待方式总结
Feb 28 Python
使用python如何删除同一文件夹下相似的图片
May 07 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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
给初学PHP的5个入手程序
2006/11/23 PHP
开源SNS系统-ThinkSNS
2008/05/18 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
PHP连接SQLServer2005的方法
2015/01/27 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
Javascript var变量隐式声明方法
2009/10/19 Javascript
div层的移动及性能优化
2010/11/16 Javascript
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
jquery实现手风琴效果
2015/11/20 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
Js中async/await的执行顺序详解
2017/09/22 Javascript
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
Angular实现的日程表功能【可添加及隐藏显示内容】
2017/12/27 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
JS对日期操作封装代码实例
2019/11/08 Javascript
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
从Python程序中访问Java类的简单示例
2015/04/20 Python
python 实时遍历日志文件
2016/04/12 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
荷兰本土平价百货:HEMA
2017/10/23 全球购物
搞笑欢迎词大全
2015/09/30 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
你喜欢篮球吗?Python实现篮球游戏
2021/06/11 Python
Python下opencv库的安装过程及问题汇总
2021/06/11 Python