一个简单的python线程池框架
初学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线程池框架的更多相关文章
- 自定义简单版本python线程池
python未提供线程池模块,在python3上用threading和queue模块自定义简单线程池,代码如下: #用threading queue 做线程池 import queue import ...
- 一个简单的linux线程池(转-wangchenxicool)
线程池:简单地说,线程池 就是预先创建好一批线程,方便.快速地处理收到的业务.比起传统的到来一个任务,即时创建一个线程来处理,节省了线程的创建和回收的开销,响应更快,效率更高. 在linux中,使用的 ...
- Python线程池与进程池
Python线程池与进程池 前言 前面我们已经将线程并发编程与进程并行编程全部摸了个透,其实我第一次学习他们的时候感觉非常困难甚至是吃力.因为概念实在是太多了,各种锁,数据共享同步,各种方法等等让人十 ...
- 分享一个自制的 .net线程池
扯淡 由于项目需求,需要开发一些程序去爬取一些网站的信息,算是小爬虫程序吧.爬网页这东西是要经过网络传输,如果程序运行起来串行执行请求爬取,会很慢,我想没人会这样做.为了提高爬取效率,必须使用多线程并 ...
- 自定义高级版python线程池
基于简单版创建类对象过多,现自定义高级版python线程池,代码如下 #高级线程池 import queue import threading import time StopEvent = obje ...
- Java多线程系列 JUC线程池01 线程池框架
转载 http://www.cnblogs.com/skywang12345/p/3509903.html 为什么引入Executor线程池框架 new Thread()的缺点 1. 每次new T ...
- python线程池ThreadPoolExecutor(上)(38)
在前面的文章中我们已经介绍了很多关于python线程相关的知识点,比如 线程互斥锁Lock / 线程事件Event / 线程条件变量Condition 等等,而今天给大家讲解的是 线程池ThreadP ...
- Java 线程池框架核心代码分析--转
原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...
- 【JUC】JUC线程池框架综述
一.前言 在分析完了JUC的锁和集合框架后,下面进入JUC线程池框架的分析,下面给出JUC线程池的总体框架,之后再逐一进行分析. 二.JUC线程池框架图 说明:从上图可知,JUC线程池框架中的其他接口 ...
随机推荐
- [问题记录.VisualStudio]VS2013无法新增和打开项目
[问题描述] 1) 打开项目失败,报“项目文件只读”或“空引用”错误. 2) 无法新建项目,没有任何可用模板. 3) TFS都正常 [问题产生] 机器环境: 1) 装的Win10双系统,其中一个系统是 ...
- HandlerThread源码分析
其实原本HandlerThread的分析不应该单独开一篇博客的,应该在讲消息机制的那一片中一起分析. 但当时忘记了,而且今天第一次用MarkDown写博客,有点上瘾,就再来一篇,权当滥竽充数过过手瘾. ...
- 借助无线路由器+2台笔记本+Windows桥接功能,成功绕过了微信聊天记录迁移的BUG
最近入了台iphone se,在迁移微信聊天记录的时候,遇到个BUG.它的迁移流程是这样的:需要将两台手机连接到同一个WIFI上面,然后新手机扫旧手机上面的二维码,来完成导入.中途遇到的问题是: 此时 ...
- ORACLE存储过程创建失败,如何查看其原因
工作中用SQL Server比较多,Oracle可以说是小白,最近想用存储过程来完成单据复制的功能,结果遇到各种问题,其实都是非常简单的问题,但是对我来说还是花了很多时间来解决,浪费这些时间非常不值得 ...
- C与C# socket 跨平台通讯传输结构体
最近需要写一个C组成的服务器端与C#的客户端进行交互的软件,刚开始写的时候发现C#端解析时候出现了故障,经过仔细研究后发现原因是发送方传输太快,出现了所谓粘包的现象.也就是在C#端的Receive() ...
- ActionBarSherlock环境搭建
1.在官网http://actionbarsherlock.com/下载ActionBarSherlock包解压到. 2.创建自己的Android工程: 3.File -> New -> ...
- Spring 4 官方文档学习(十五)CORS支持
1.介绍 由于安全原因,浏览器禁止AJAX请求不在当前域内的资源.例如,你在一个浏览器标签中检查你的银行账户时,可能在另一个标签中打开了evil.com .来自evil.com的脚本绝对不可以用AJA ...
- C#时间戳转成php的time()
DateTime timeStamp = new DateTime(1970,1,1); //得到1970年的时间戳 long a = (DateTime.UtcNow.Ticks - timeSt ...
- 编写更好的jQuery代码的建议
讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度的提升.快速渲染 ...
- html5表单验证
表单验证为终端用户检测无效的数据并标记这些错误,是一种用户体验的优化. 下面展现浏览器自带的验证功能也可在移动端中查看: HTML部分: <!DOCTYPE html> <html ...