初学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布局中实现圆角边框

    设置corners_bg.xml 设置边框圆角可以在drawable-mdpi目录里定义一个xml: <?xml version="1.0" encoding="u ...

  2. MySQL的简单查询语句

    查询: 一:查询所有数据 select * from Info 查所有数据 select Code,Name from Info 查特定列 二:根据条件查 select * from Info whe ...

  3. 在c#中IO流读写操作

    1.使用FileStream读写文件 文件头: using System;using System.Collections.Generic;using System.Text;using System ...

  4. 微信公众平台创建自定义菜单中文编码导致system error

    创建包含了中文的自定义菜单时总是返回{"errcode":-1,"errmsg":"system error"},要将编码方式设置为UTF- ...

  5. 关于实现Extjs动态加载类的方式实现

    Extjs4以前的版本没有动态加载类的方式,这样开发程序的时候加载很多的js会导致加载变慢,由于本人一直使用extjs3的版本进行开发,于是简单实现了一个动态加载类的管理器,使用方式与extjs4的方 ...

  6. Ext.Net TreePanel 修改Icon图标

    分类: Ext.Net2012-09-24 13:44 1779人阅读 评论(0) 收藏 举报 webformserverextassemblyxhtmlobject 1.默认icon 2.自定义ic ...

  7. VBA操作单元格

    行或列的Group化 ws.Rows("row1:row2").group row1:Group化的开始行                row2:Group化的结束行 ws.Co ...

  8. The import java.io cannot be resolved

    在导入一个新项目后出现 The import java.io cannot be resolved.String cannot be resolved to a type 解决: 将JRE Syste ...

  9. IIS 7 Web服务器上部署ASP.NET网站(转)

    IIS 7 Web服务器上部署ASP.NET网站小记 摘自:http://swanmsg.blog.sohu.com/162111073.html 网上查找了很久关于iis7配置asp.net配置问题 ...

  10. mysql galera cluster 集群的分裂与仲裁机制

    集群的分裂 当集群由于网络原因分裂为几个单独的组时(一组可能是单节点,也可能是几个互联的节点),数据出现不一致,此时可能产生脑裂及数据不一致.这种情况 下,只有一组节点能够继续提供服务,这组节点的状态 ...