多线程处理框架

python2.7

python3.5

多线程通用任务处理型驱动框架
probe_type 探测类型rtsp或者http
task_queue 任务队列
task_handler 任务处理函数
thread_count 线程数数目
result_queue 结果存放队列
args,kwargs为可变参数列表,为扩展性考虑

2016-8-26

python3新增中断操作

#!/usr/bin/env python2
# coding=utf-8
import threading
import argparse
import Queue class MultiThreadHandler(object):
"""
多线程通用任务处理型驱动框架
task_queue 任务队列
task_handler 任务处理函数
thread_count 线程数数目
result_queue 结果存放队列
args,kwargs为可变参数列表,为扩展性考虑
""" def __init__(self, task_queue, task_handler, result_queue=None, thread_count=1, *args, **kwargs):
self.task_queue = task_queue
self.result_queue = result_queue
self.task_handler = task_handler
self.thread_count = thread_count
self.args = args
self.kwagrs = kwargs def run(self, block_flag):
thread_pool = []
for i in range(self.thread_count):
t = _TaskHandler(self.task_queue, self.task_handler, self.result_queue, *self.args, **self.kwagrs)
thread_pool.append(t)
for th in thread_pool:
th.start()
# 阻塞等待所有线程结束
if block_flag:
for th in thread_pool:
threading.Thread.join(th) class _TaskHandler(threading.Thread):
"""
一个任务处理器线程,task_queue任务队列,result_queue是结果队列,task_handler任务处理函数,args,kwargs可变控制参数
""" def __init__(self, task_queue, task_handler, result_queue=None, *args, **kwargs):
threading.Thread.__init__(self)
self.task_queue = task_queue
self.task_handler = task_handler
self.result_queue = result_queue
self.args = args
self.kwargs = kwargs def run(self):
while True:
try:
item = self.task_queue.get(False)
self.task_handler(item, self.result_queue, *self.args, **self.kwargs)
self.task_queue.task_done()
except Queue.Empty, e:
print "all task has done!"
break
except Exception, e:
print "error:", e def out(item, result_queue): # 自行加载处理函数
host = item
result_queue.put(host) if __name__ == '__main__':
# parse the command args
parse = argparse.ArgumentParser()
parse.add_argument("-f", "--file", help="the target file")
parse.add_argument("-th", "--thread", type=int, default=1, help="the thread number")
parse.add_argument("-o", "--outfile", help="the outputfile")
# 解析命令行
results = parse.parse_args()
filename = results.file
th = results.thread
outfile = results.outfile
task_queue = Queue.Queue()
out_queue = Queue.Queue()
with open(filename) as f:
for line in f:
line = line.rstrip()
if line:
task_queue.put(line) MultiThreadHandler(task_queue, out, out_queue, th).run(True) with open(outfile, "w+") as f:
while True:
f.write(out_queue.get() + '\n')
if out_queue.empty():
break
#! python3
# coding=utf-8 import queue
import argparse
import threading
import time class MultiThreadHandler(object):
"""
多线程通用任务处理型驱动框架
task_queue 任务队列
task_handler 任务处理函数
thread_count 线程数数目
result_queue 结果存放队列
args,kwargs为可变参数列表,为扩展性考虑
""" def __init__(self, task_queue, task_handler, result_queue=None, thread_count=1, *args, **kwargs):
self.task_queue = task_queue
self.task_handler = task_handler
self.result_queue = result_queue
self.thread_count = thread_count
self.args = args
self.kwagrs = kwargs
self.thread_pool = [] def run(self, block_flag):
for i in range(self.thread_count):
t = _TaskHandler(self.task_queue, self.task_handler, self.result_queue, *self.args, **self.kwagrs)
self.thread_pool.append(t)
for th in self.thread_pool:
th.setDaemon(True)
th.start()
'''
# 阻塞等待所有线程结束
if block_flag:
for th in thread_pool:
threading.Thread.join(th)
'''
# 阻塞等待所有线程结束
while self._check_stop():
try:
time.sleep(1)
except KeyboardInterrupt:
print('KeyboardInterruption')
self.stop_all()
break
print('>>>all Done') def _check_stop(self):
"""检查线程池中所有线程是否全部运行完"""
finish_num = 0
for th in self.thread_pool:
if not th.isAlive():
finish_num += 1 return False if finish_num == len(self.thread_pool) else True def stop_all(self):
"""掉用线程体stop方法,停止所有线程"""
for th in self.thread_pool:
th.stop() class _TaskHandler(threading.Thread):
"""
一个任务处理器线程,task_queue任务队列,task_handler任务处理函数,result_queue是结果队列,args,kwargs可变控制参数
可外部中断
""" def __init__(self, task_queue, task_handler, result_queue=None, *args, **kwargs):
threading.Thread.__init__(self)
self.task_queue = task_queue
self.task_handler = task_handler
self.result_queue = result_queue
self.args = args
self.kwargs = kwargs
self.is_stoped = True def run(self):
while self.is_stoped:
try:
item = self.task_queue.get(False) # block= False
self.task_handler(item, self.result_queue, *self.args, **self.kwargs)
self.task_queue.task_done() # 退出queue
except queue.Empty as e:
print("all task has done!")
break
except Exception as e:
print("error:", e)
# time.sleep(1) def stop(self):
self.is_stoped = False def out(item, result_queue): # 加载处理函数
result_queue.put(item) if __name__ == '__main__':
# parse the command args
start = time.time()
parse = argparse.ArgumentParser()
parse.add_argument("-f", "--file", help="the target file")
parse.add_argument("-th", "--thread", type=int, default=1, help="the thread number")
parse.add_argument("-o", "--outfile", help="the outputfile")
# 解析命令行
results = parse.parse_args()
filename = results.file
th = results.thread
outfile = results.outfile
task_queue = queue.Queue()
out_queue = queue.Queue()
with open(filename, "r+") as f:
for line in f:
line = line.rstrip()
if line:
task_queue.put(line) MultiThreadHandler(task_queue, out, out_queue, th).run(True) with open(outfile, "w+") as f:
while True:
f.write(out_queue.get() + '\n')
if out_queue.empty():
break
end = time.time()
print(end - start)

python 多线程处理框架的更多相关文章

  1. 教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感. Scr ...

  2. 【python】15个最受欢迎的Python开源框架

    Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响.Django是走大而全的方向,它最出名的是其全自动化的管理后台: ...

  3. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

  4. Python定时任务框架APScheduler 3.0.3 Cron示例

    APScheduler是基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.基 ...

  5. python bottle框架

    python bottle框架 简介: Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. Bottl ...

  6. python web框架——扩展Django&tornado

    一 Django自定义分页 目的:自定义分页功能,并把它写成模块(注意其中涉及到的python基础知识) models.py文件 # Create your models here. class Us ...

  7. python web框架——初识tornado

    一 Tornado概述 Tornado是FriendFeed使用的可扩展的非阻塞式web框架及其相关工具的开源版本.这个Web框架看起来有些像web.py或者Google的 webapp,不过为了能有 ...

  8. 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...

  9. 14个最受欢迎的Python开源框架

    本文从GitHub中整理出的14个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python Web应用开发框架 Dja ...

随机推荐

  1. UVa 10465 Homer Simpson(DP 全然背包)

     题意 霍默辛普森吃汉堡  有两种汉堡  一中吃一个须要m分钟  还有一种吃一个须要n分钟  他共同拥有t分钟时间    要我们输出他在尽量用掉全部时间的前提下最多能吃多少个汉堡  假设时间无法用 ...

  2. scala并发编程原生线程Actor、Case Class下的消息传递和偏函数实战

    參考代码: import scala.actors._ case class Person(name:String,age:Int) class HelloActor extends Actor{ d ...

  3. Linux系统下怎样配置SSH?怎样开启SSH?

    SSH作为Linux远程连接重要的方式,怎样配置安装linux系统的SSH服务.怎样开启SSH?以下来看看吧(本例为centos系统演示怎样开启SSH服务) 1.登陆linux系统,打开终端命令.输入 ...

  4. Libgdx: android单机斗地主支持局域网wifi联网的网络模块核心代码

    这个作品是我近期写的,结合我的毕业设计的通信模块和之前的单机版斗地主.我已经上架到豌豆荚了,贴了点广告,看看能不能赚点茶钱. 但是一点也不乐观.因此我想分享给大家源代码. 仅仅要不用于商业. 以下先贴 ...

  5. luogu2014 选课 背包类树形DP

    题目大意:有N门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有学完了课程a,才能学习课程b).一个学生要从这些课程里选择M门课程学习,问他能获得的最大学分是多少? ...

  6. 理解和配置 Linux 下的 OOM Killer【转】

    本文转载自:http://www.vpsee.com/2013/10/how-to-configure-the-linux-oom-killer/ 最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉 ...

  7. Uva 11754(枚举+中国剩余定理)

    #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...

  8. nyoj--252--01串(水题)

    01串 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有"11"子串的这种长度的0 ...

  9. Intellij IDEA社区版打包Maven项目成war包,并部署到tomcat上

    转自:https://blog.csdn.net/yums467/article/details/51660683 需求分析 我们利用 Intellij idea社区版IDE开发了一个maven的sp ...

  10. java环境的配置和求最大子数组

    做java开发的朋友,都应该有一个适合自己的开发环境,而eclipse就是这么一个适合java开发的集成环境,完全免费,是java开发人员的必备平台.在安装eclipse之前需要安装JDK, JDK是 ...