初学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. Android布局6大类

    1:在我们Android开发中,常见的布局的方式有6大类 线性布局LinearLayout 相对布局RelativeLayout 表格布局TableLayout 单帧布局FrameLayout 绝对布 ...

  2. perl chomp

    在寻找k_word时,为了去打末尾的换行符,使用chomp;但 在windows下创建的的文件,读取一行,如一行为  weather  把它赋值为$str,然后print length($str),得 ...

  3. delphi7 在虚拟机 vbox里面安装失败

    提示Error 1324.The path My Pictures contains an invalid character. 解决办法:新建一个文件夹,123, 设置 我的文档文件夹 目录指向 “ ...

  4. TDDL DataSource

    TDDL DataSource 分为 AtomDataSource GroupDatasource 他们两者没有依赖关系, 都实现了 JDBC 规范, 可以作为独立的 datasource 单独使用 ...

  5. 谷歌Cartographer学习(1)-快速安装测试

    谷歌自己提供了安装方法,但是安装比较繁琐,我做了一定的修改,代码放到个人github上,https://github.com/hitcm/. ros下面的安装非常快捷,只需要catkin_make即可 ...

  6. java8中CAS的增强

    注:ifeve.com的同名文章为本人所发,此文在其基础做了些调整.转载请注明出处! 一.java8中CAS的增强 前些天,我偶然地将之前写的用来测试AtomicInteger和synchronize ...

  7. 金蝶K/3 Cloud 界面解析过程

    服务端 目前也就是iis服务器生成Json描述返回给不同的展现端最解析. 不同的展现端,可以有Silverlight.WPF.Html5.Winform 当然还有IOS和Android端做解析展现 对 ...

  8. 哈哈,修改PHP5.4.44语法成功

    作为一个脚本语言,面向对象的继承基本上不想用到,强类型比较也想使用==直接比较.作为专业程序员不想让PHP解释器代劳过多. 修改了这个MOD版本,效果杠杠的.

  9. JAVA期末设计第十三周

    一.项目完成计划 十三周和十四周完成用户交互界面的设计(1.登陆界面2.订票以及查询界面3.用户管理界面4.退票界面): 十三周完成登陆界面,十四周完成订票以及查询界面,用户管理界面和退票界面 十五周 ...

  10. ZooKeeper事务日志记录器SyncRequestProcessor

    SyncRequestProcessor作为一个ZooKeeper中的一个关键线程(ZooKeeperCriticalThread),是ZooKeeper请求处理链中的事务日志记录处理器,其主要用来将 ...