一些可以复用的代码(py实现)

 自动重启中断线程


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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值