将字典变为类
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分钟.
改进方案,分批启动任务,每秒启动的任务数量限制在一定范围内(范围根据自己的实际情况制定) .