自动重启中断线程
class Capture(threading.Thread):
def __init__(self, queueHandler):
threading.Thread.__init__(self,name='Capture')#线程名name设置为与类名相同
self.queueHandler = queueHandler
def run(self):
logger.info('Start capturing msgs...')
self.queueHandler.capture_msgs()
class Task(threading.Thread):
def __init__(self, queueHandler):
threading.Thread.__init__(self,name='Task')
self.queueHandler = queueHandler
def run(self):
self.queueHandler.regularly()
class QueueHandler(object):
pass
def restart_thread(initThreadsName,queueHandler):
nowThreadsName = [] # 用来保存当前线程名称
now = threading.enumerate() # 获取当前线程对象
for i in now:
nowThreadsName.append(i.getName()) # 保存当前线程名称
for name in initThreadsName:
if name not in nowThreadsName:
logger.info('thread %s is not alive' % name)
t = getattr(sys.modules['__main__'],name)(queueHandler) #用字符串name调用当前模块内的类
t.setName(name)
t.start()
logger.info('thread %s restarted' % name)
initThreadsName = []
init = threading.enumerate() # 获取初始化的线程对象
for i in init:
initThreadsName.append(i.getName()) # 保存初始化线程组名字
try:
queueHandler = QueueHandler(check_mode=check_mode)
init_threads = []
capture = Capture(queueHandler)
init_threads.append(capture)
task = Task(queueHandler)
init_threads.append(task)
for t in init_threads:
t.start()
logger.info('thread %s started' % t.getName())
initThreadsName = []
init = threading.enumerate() # 获取初始化的线程对象
for i in init:
initThreadsName.append(i.getName()) # 保存初始化线程组名字
except Exception,e:
traceback.print_exc(e)
restart_thread(initThreadsName,queueHandler)
自适应容量单位
import math
import types
def human( num, ice = True, around = 2 ):
if isinstance( num, str):
num = int( num )
if type( num ) not in ( types.IntType, types.LongType, types.FloatType ):
raise Exception, num
if num < 0:
_start = '-'
num = 0 - num
else:
_start = ''
if ice:
_names = [( 'Yi', 8 ), ( 'Zi', 7 ), ( 'Ei', 6 ),
( 'Pi', 5 ), ( 'Ti', 4 ), ( 'Gi', 3 ),
( 'Mi', 2 ), ( 'Ki', 1 ), ( '', 0 )]
_size = 1024
else:
_names = [( 'Y', 8 ), ( 'Z', 7 ), ( 'E', 6 ),
( 'P', 5 ), ( 'T', 4 ), ( 'G', 3 ),
( 'M', 2 ), ( 'K', 1 ), ( '', 0 )]
_size = 1000
for _n, _p in _names:
_pow = pow( _size, _p )
if num >= _pow:
if around > 0:
return _start + str( round(float(num)/_pow , around) ) + _n
else:
return _start + str( int(round(float(num)/_pow , around)) ) + _n
else:
return num
计算指定时长之前的时间
def count_time( day=0, hour=0, minute=0):
ts = time.time() - day * 24 * 3600 - hour * 3600 - minute * 60
st = time.localtime( ts )
return time.strftime( '%Y-%m-%d', st ), time.strftime( '%H', st ), time.strftime( '%M', st )
url编码
def escape( url ):
if type( url ) == type( u'' ):
url = url.encode( 'utf-8' )
return urllib.quote_plus( url )
从字典中按key选取部分数据
def dicsub( dic, *ks ):
return dict( [ ( k, dic[ k ] ) for k in ks ] )
转换字符串key的类型为原类型:
def eval_key(self,dct):
for key in dct.keys():
dct[eval(key)] = dct.pop(key)
使用dct进行迭代时,原key为长度为1的元组时报错:
{u"('10.22.4.59',)": {u'files_num': 2, u'old': False, u'ts': 1545305178}}
str,key : ('10.22.4.59',)
tuple,key : ('10.22.4.59',)
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/local/python/python2.7/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
File "QueueHandler.py", line 50, in run
self.queueHandler.capture_msgs()
File "QueueHandler.py", line 150, in capture_msgs
self.eval_key(msg)
File "QueueHandler.py", line 144, in eval_key
dct[eval(key)] = dct.pop(key)
TypeError: eval() arg 1 must be a string or code object
统计函数的运行时间的装饰器
def count_time(func):
def int_time(*args,**kwargs):
start_time = datetime.datetime.now() # 程序开始时间
func(*args,**kwargs)
over_time = datetime.datetime.now() # 程序结束时间
total_time = (over_time-start_time).total_seconds()
print('程序共计%s秒' % total_time)
return int_time
获取嵌套字典中深层字典的指定键值
get_deep_dict( d, keys, default = None ):
if len( keys ) == 0:
return default
for k in keys[ :-1 ]:
d = d.get( k ) or {}
return d.get( keys[-1], default )
捕获异常装饰器
def _run_safe( func ):
def _wrapper( *args, **argkv ):
try:
return func( *args, **argkv )
except Exception as e:
logger.exception( repr( e ) )
return _wrapper
按固定长度n分割字符串str:
for i in range(len(str))[::n]:
print str[i:i+n]
时间戳转格式化时间
def format_time(tsp):
return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(tsp))