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下利用OpenCV来旋转图像的教程
Apr 16 Python
Python3中使用PyMongo的方法详解
Jul 28 Python
Python中安装easy_install的方法
Nov 18 Python
kafka-python批量发送数据的实例
Dec 27 Python
python设定并获取socket超时时间的方法
Jan 12 Python
pyqt5利用pyqtDesigner实现登录界面
Mar 28 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
使用python从三个角度解决josephus问题的方法
Mar 27 Python
python读取hdfs并返回dataframe教程
Jun 05 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
Sep 16 Python
Python3读写ini配置文件的示例
Nov 06 Python
Python借助with语句实现代码段只执行有限次
Mar 23 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
日本因肺炎疫情影响,这几部动漫推延播放!
2020/03/03 日漫
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
PHP 替换模板变量实现步骤
2009/08/24 PHP
PHP strncasecmp字符串比较的小技巧
2011/01/04 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
phpstudy2020搭建站点的实现示例
2020/10/30 PHP
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
基于jQuery试卷自动排版系统
2010/07/18 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
JavaScript中自定义事件用法分析
2014/12/23 Javascript
jquery实现可拖拽弹出层特效
2015/01/04 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
Vue仿手机qq的实例代码(demo)
2017/09/08 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
Python3计算三角形的面积代码
2017/12/18 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
在Python中使用defaultdict初始化字典以及应用方法
2018/10/31 Python
python采集微信公众号文章
2018/12/20 Python
python实现七段数码管和倒计时效果
2019/11/23 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
syb养殖创业计划书
2014/01/09 职场文书
电子邮箱格式怎么写
2014/01/12 职场文书
求职信格式范文
2015/03/19 职场文书
升学宴来宾致辞
2015/07/27 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书