python 多线程处理框架
多线程处理框架
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 多线程处理框架的更多相关文章
- 教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感. Scr ...
- 【python】15个最受欢迎的Python开源框架
Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响.Django是走大而全的方向,它最出名的是其全自动化的管理后台: ...
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- Python定时任务框架APScheduler 3.0.3 Cron示例
APScheduler是基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.基 ...
- python bottle框架
python bottle框架 简介: Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. Bottl ...
- python web框架——扩展Django&tornado
一 Django自定义分页 目的:自定义分页功能,并把它写成模块(注意其中涉及到的python基础知识) models.py文件 # Create your models here. class Us ...
- python web框架——初识tornado
一 Tornado概述 Tornado是FriendFeed使用的可扩展的非阻塞式web框架及其相关工具的开源版本.这个Web框架看起来有些像web.py或者Google的 webapp,不过为了能有 ...
- 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...
- 14个最受欢迎的Python开源框架
本文从GitHub中整理出的14个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python Web应用开发框架 Dja ...
随机推荐
- LINQ体验(8)——LINQ to SQL语句之Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods
我们继续解说LINQ to SQL语句,这篇我们来讨论Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作 . Union Al ...
- expdp impdp 数据库导入导出命令具体解释
一.创建逻辑文件夹,该命令不会在操作系统创建真正的文件夹.最好以system等管理员创建. create directory dpdata1 as 'd:\test\dump'; 二.查看管理理员文件 ...
- 贪吃蛇c++实现
近期没事翻了一下曾经写的程序.真是不堪入目.曾经真是什么都不懂.只是有一个程序倒是挺有意思的,大二的时候写的一个贪吃蛇游戏.尽管程序非常难看,还有非常多漏洞.但也是这个程序让我真正開始喜欢上了编程.不 ...
- Android SQLite服务--创建、增删改查
<pre name="code" class="java">import android.content.Context; import andro ...
- IOS算法(二)之选择排序
选择排序: 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后.直到所有待排序的数据元素排完. 选择排序是不稳定的排序方法. 一. 算法描写叙述 选择排序:比方在一 ...
- Android 怎样实现 焦点图的 无线循环滑动的状态?
參考网址:http://my.oschina.net/xsk/blog/119167 总体的架构:ViewPgaer 中直接嵌套 IamgeView 方案一: 重写Viewpager 这样有局限性 ...
- Amazon宣布将MXNet作为AWS的深度学习框架——貌似性能比tf高啊
Amazon公司的Werner Vogels于上周宣布Amazon深度学习框架将会正式选用MXNet,并且AWS将会通过增加源代码贡献.改进文档以及支持来自其它框架的可视化.开发以及迁移工具,为实现M ...
- [POJ 3621] Sightseeing Cows
[题目链接] http://poj.org/problem?id=3621 [算法] 01分数规划(最优比率环) [代码] #include <algorithm> #include &l ...
- discuz “欣” “衡” 用户不能注册 bug修改
discuz “欣” “衡” 用户不能注册 原因是 discuz 有这样一段代码 function check_username($username) { $guestexp = '\xA1\xA1| ...
- JXOI2019 退役记
day0 考前一天在机房和RyeCatcher,还有高一数竞大佬wyt一起颓三国杀,被深深吸引无法自拔,所谓大考大浪,也算是缓解缓解压力 刷刷空间发现好多外地OIer都赶到江科了,萌生出去见一见我江西 ...