python snack

将字典变为类


def obj_dic(d):
    top = type('new', (object,), d)
    seqs = tuple, list, set, frozenset
    for i, j in d.items():
        if isinstance(j, dict):
            setattr(top, i, obj_dic(j))
        elif isinstance(j, seqs):
            setattr(top, i,type(j)(obj_dic(sj) if isinstance(sj, dict) else sj for sj in j))
        else:
            setattr(top, i, j)
    return top

def _getObjectInfo(obj):
    attrs = dir(obj)
    result = ""
    p = re.compile("__.*__")
    for attr in attrs:
        m = p.search(attr)
        if m == None:
            result += "." + str(attr) + "=" + str(getattr(obj, attr)) + "\n"
    return result

 

2.自定义mysql连接的上下文管理器

 

@contextlib.contextmanager 
def mysql(env='dev'):
    conn = pymysql.connect(**mysql_db_conf[env])
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    try:
       yield cursor 
    finally:
       conn.commit()
       cursor.close() 
       conn.close()

使用:
 

with mysql(self.env) as cursor:

    sql = "SELECT * FROM target_order where trade_date = %s ;" 
    today = today = arrow.now().date().__str__() 
    cursor.execute(sql, (today)) 
    data = cursor.fetchall()

3. 一个优先级队列

import heapq

class PriorityQueue():
#一个优先级队列 
    def __init__(self):
        self.queue =[] 
        self._index = 0 

    def push(self,item,priority):
        heapq.heappush(self.queue,(-priority,self._index,item)) 
        self._index +=1 
   
    def pop(self):
        return heapq.heappop(self.queue)[-1]

    def __len___(self):

        return self._index

4. 类装饰器创建单例

def singleGen(cls, _*_args, _**_kw):
    instance={}
    def _singleGen():
        if cls not in instance:
             instance[cls]=cls(*args, **kw)
        return instance[cls]
    return _singleGen

5.  model > json

    class MyUser(models.Model):  
      
        def toJSON(self):  
            fields = []  
            for field in self._meta.fields:  
                fields.append(field.name)  
          
            d = {}  
            import datetime  
            for attr in fields:  
                if isinstance(getattr(self, attr),datetime.datetime):  
                    d[attr] = getattr(self, attr).strftime('%Y-%m-%d %H:%M:%S')  
                elif isinstance(getattr(self, attr),datetime.date):  
                    d[attr] = getattr(self, attr).strftime('%Y-%m-%d')  
                else:  
                    d[attr] = getattr(self, attr)  
          
            import json  
            return json.dumps(d)  

json > model

    def text(request):  
        if 'user' in request.session:               
            user = request.session['user']  
            user = MyUser(**json.loads(user))      #将json序列转换成model  
            event = UserEvent(user=user,ETime=date.today())  
            event.save()  
        else:  
            user = None  
        return render_to_response('welcome.html',{'user':user})  

6,pyhton 启动不同数量的线程池所需时间跟数量成正相关关系

以apscheduler为例测试

from apscheduler.schedulers.background import BackgroundScheduler
import time
import arrow
executors = {
    'default': ThreadPoolExecutor(1000),
    'processpool': ProcessPoolExecutor(30),
    # 'default':ProcessPoolExecutor(30)
}

scheduler = BackgroundScheduler(executors=executors)


def a():
    print('start',arrow.now().time().__str__())

    time.sleep(1)

    print('end',arrow.now().time().__str__())
for i in range(1000):
    scheduler.add_job(func=a,trigger='cron',second = '*/5')

scheduler.start()

while True:
    time.sleep(1)

经测试,起一千个任务的线程池 需要耗时1s 左右,实际任务的启动时间肯定比这个长,所以就会导致有job被miss,进而导致设定的时间间隔翻倍,(例如,30秒一次的任务,变成了 1分钟.

改进方案,分批启动任务,每秒启动的任务数量限制在一定范围内(范围根据自己的实际情况制定) .

 

 

转载于:https://my.oschina.net/u/3425794/blog/1791708

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值