初学python,实现了一个简单的线程池框架,线程池中除Wokers(工作线程)外,还单独创建了一个日志线程,用于日志的输出.线程间采用Queue方式进行通信.

代码如下:(不足之处,还请高手指正)

  

 #!/usr/bin/env python
# -*- coding:utf-8 -*- __author__ = "pandaychen" import Queue
import sys
import os
import threading
import time
import signal def handler():
print "press CTRL+C to end...."
sys.exit(1) def call_function(para):
time.sleep(5)
return para def LoggingFun(t_filename,t_logcontent):
logpath = './log/'
curdate = time.strftime("%Y%m%d")
newpath = './log/'+t_filename+'_'+curdate if os.path.exists(logpath):
pass
else:
os.mkdir(logpath) try:
filehd = open(newpath,'a+')
newcontent = '['+str(time.strftime("%Y-%m-%d %H:%M:%S"))+']'+t_logcontent+'\n'
filehd.writelines(newcontent)
filehd.close()
except Exception,e:
pass class LogThread(threading.Thread):
def __init__(self,logQueue,**kwds):
threading.Thread.__init__(self,**kwds)
self.logQueue = logQueue
self.setDaemon(True) def run(self):
while 1:
#log = self.logQueue.get(False)
log = self.logQueue.get()
if log:
LoggingFun("test",log)
pass
else:
LoggingFun("test","log thread sleep 1s")
time.sleep(1) #封装为一个线程类
class Worker(threading.Thread): # 处理工作请求
def __init__(self, workQueue, resultQueue,logQueue, threadid,**kwds):
threading.Thread.__init__(self, **kwds)
self.setDaemon(True)
self.workQueue = workQueue
self.resultQueue = resultQueue
self.logQueue = logQueue
self.threadid = threadid def run(self):
while 1:
try:
callable, args, kwds = self.workQueue.get(False) # get a task
res = callable(*args, **kwds)
strres = "thread:"+ str(self.threadid) + " done,"+"args:"+str(res) self.logQueue.put(strres)
self.resultQueue.put(res) # put result
except Queue.Empty:
break class WorkManagerPool: # 线程池管理,创建
def __init__(self, num_of_workers=10):
self.workQueue = Queue.Queue() # 请求队列
self.resultQueue = Queue.Queue() # 输出结果的队列
self.logQueue = Queue.Queue()
self.workers = []
self._recruitThreads(num_of_workers) def _recruitThreads(self, num_of_workers):
for i in range(num_of_workers):
worker = Worker(self.workQueue, self.resultQueue,self.logQueue,i) # 创建工作线程
worker.setDaemon(True)
self.workers.append(worker) # 加入到线程队列 logthread = LogThread(self.logQueue)
self.workers.append(logthread) def start(self):
for w in self.workers:
w.start() def wait_for_complete(self):
while len(self.workers):
worker = self.workers.pop() # 从池中取出一个线程处理请求
worker.join()
if worker.isAlive() and not self.workQueue.empty():
self.workers.append(worker) # 重新加入线程池中
print 'All jobs were complete.' def add_job(self, callable, *args, **kwds):
self.workQueue.put((callable, args, kwds)) # 向工作队列中加入请求 def get_result(self, *args, **kwds):
return self.resultQueue.get(*args, **kwds) def main():
signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler) try:
num_of_threads = int(sys.argv[1])
except:
num_of_threads = 10
start = time.time()
workermanagepool = WorkManagerPool(num_of_threads)
#print num_of_threads
urls = ['http://bbs.qcloud.com'] * 1000
for i in urls:
workermanagepool.add_job(call_function, i) workermanagepool.start()
workermanagepool.wait_for_complete()
print time.time() - start if __name__ == '__main__':
main()

一个简单的python线程池框架的更多相关文章

  1. 自定义简单版本python线程池

    python未提供线程池模块,在python3上用threading和queue模块自定义简单线程池,代码如下: #用threading queue 做线程池 import queue import ...

  2. 一个简单的linux线程池(转-wangchenxicool)

    线程池:简单地说,线程池 就是预先创建好一批线程,方便.快速地处理收到的业务.比起传统的到来一个任务,即时创建一个线程来处理,节省了线程的创建和回收的开销,响应更快,效率更高. 在linux中,使用的 ...

  3. Python线程池与进程池

    Python线程池与进程池 前言 前面我们已经将线程并发编程与进程并行编程全部摸了个透,其实我第一次学习他们的时候感觉非常困难甚至是吃力.因为概念实在是太多了,各种锁,数据共享同步,各种方法等等让人十 ...

  4. 分享一个自制的 .net线程池

    扯淡 由于项目需求,需要开发一些程序去爬取一些网站的信息,算是小爬虫程序吧.爬网页这东西是要经过网络传输,如果程序运行起来串行执行请求爬取,会很慢,我想没人会这样做.为了提高爬取效率,必须使用多线程并 ...

  5. 自定义高级版python线程池

    基于简单版创建类对象过多,现自定义高级版python线程池,代码如下 #高级线程池 import queue import threading import time StopEvent = obje ...

  6. Java多线程系列 JUC线程池01 线程池框架

    转载  http://www.cnblogs.com/skywang12345/p/3509903.html 为什么引入Executor线程池框架 new Thread()的缺点 1. 每次new T ...

  7. python线程池ThreadPoolExecutor(上)(38)

    在前面的文章中我们已经介绍了很多关于python线程相关的知识点,比如 线程互斥锁Lock / 线程事件Event / 线程条件变量Condition 等等,而今天给大家讲解的是 线程池ThreadP ...

  8. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  9. 【JUC】JUC线程池框架综述

    一.前言 在分析完了JUC的锁和集合框架后,下面进入JUC线程池框架的分析,下面给出JUC线程池的总体框架,之后再逐一进行分析. 二.JUC线程池框架图 说明:从上图可知,JUC线程池框架中的其他接口 ...

随机推荐

  1. table 排序 添加 删除 等操作

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. Java(String)

    1>String类型判等 (1)请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? package StringPool; publi ...

  3. C# Acrobat打开pdf出错,提示Acrobat.AcroPDDocClass不能强制转换为Acrobat.CAcroPDDoc,使用com组件{9B4CD3E7-4981-101B-9CA8-9240CE2738AE},HRESULT: 0x80004002

    要批量将PDF文件内容按页转换为图片,在写的过程过程遇到两个问题. 一,下载的SDK中,提示要引用COM组件Acrobat,但在我的电脑上就是看不到,只能看到Adobe Acrobat 7.0 Bro ...

  4. 實際案例: 已知要獲取臨時票証 (JsApi Ticket) 才能調用的接口

    需獲取票証才能調用的接口,簡單列示如下: 一.基礎類 1. wx.checkJsApi (當前客戶端是否支持指定JS) 二.分享類 1.wx.onMenuShareTimeline (分享到朋友圈)2 ...

  5. 深入浅出: Java回调机制(异步)

    一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. 回调 ...

  6. qweb

    qweb 是 odoo的模板系统, 在 odoo系统中, 它有不同的用途和实现, 一个是 web client 的 widget 的渲染引擎, 它是通过 javascript实现的,也是 最早引入到 ...

  7. Markdown 基本入门使用

    http://www.appinn.com/markdown/ markdown快速入门Markdown 常用语法: # 标题 强调:用星号(*)和底线(_)作为标记强调字词的符号,如果你的 * 和 ...

  8. angularjs 作用域

    1.指令属性取值:通过attr.someAttribute属性名字获取 以下,通过$eval(attr.data)获取value <div ng-controller="personC ...

  9. View优化

    前面写了个View画圆弧,为了让他和底层图片效果融合,采用先把圆弧画到和图片一样大小的画布上,然后用canvas的变换位图方法映射过去. bitmapWithReflection = Bitmap.c ...

  10. hdoj 1002 A+B(2)

    Problem Description I have a very simple problem for you. Given two integers A and B, your job is to ...