python学习(二)

107.
python 中的类,_name表示私有对象,只可以内部访问,但是只放君子,不妨小人。
类也是动态的,其理论很有意思,叫鸭子类型,他不要求你是个鸭子,只是说,你只要张的像,走路像就行。
用dir()方法,可以查到该对象下的属性和方法。dir(“abc”)
用hasattr(obj,attr),查看是否有该属性,obj是对象,attr是属性,返回布尔
setattr(obj,attr,num)设置值
gatattr(obj,attr) 获取值
这里的attr都是字符串类型的.

108.
is 是判断地址是否相同,可以用id()查看地址
in 判断是或包含
type() 查看数据类型
isinstance() 查看类型是否匹配,返回bool,在有继承类中比type()好用

109.
python还真是强大啊,动态绑定属性和方法,这样只是可以给本类的所有实例用,但是子类不可以,所以,子类要是想这样做,要定义
动态绑定—-slots。
slots(name,id) 给该类定义了id和name,如果超过了,就会报错。

110.
牛逼的数字。
@property用了装饰模式。好像很吊,没心思研究了。

111.
python的多继承机制貌似很屌,他自己叫做MixIn。实现就是:
calss a(b,c):
pass

112.
python 的动态到什么地步,可以在运行期去创建出对象,比如说type()的实现原理。
我们说创建实例,需要创建类,但是这里有个元类的定义,说只有有了metaclass元类,才能创建类,才能搞出实例。这个了解就好。

113.
python的异常处理机制:
try:
except 异常类名:
finally:
必须执行的
其异常基础类是BaseException.

114.
总结集中可用的调试方法:
第一,print(),这是最常用的,总结一个字,low
第二,断言,断言失败返回AssertException,可以用命令关闭:python3 -0 文件名.py
第三,logging.使用日志来记录。
第四,利用ide的debug模式。

  1. java常用的bean文件:
    背会了,艹
    org.springframework.beans.factory.config.PropertyPlaceholderConfiguer
    .property配置文件导入类
    xml导入直接用

关于innerText,innerText,outHtml,outText,第二个单词必须大写。
起作用更具意思猜出。

201.
大并发问题
大并发几个点,请求数据太多,或者是缓存数据大面积失效。
首先访问mysql数据库,数据库连接在优化后可到300-700。
如果数据太多造成的,就要用缓存,缓存的有效时间一般是正常查询到俩到三倍。
如果用redis缓存任然不能解决,就用代码搞锁机制。
正常情况下,阻塞锁和synchronize可以解决,但是数据大要用分布式锁。

分布式锁和缓存,首先判断内存中是由数据库,有直接拿去,并且加锁,另外的到备份缓存中拿去。
如果缓存中没有,则去查询。redis锁不是很好,只能支持单机的情况,分布式要用zookeeper,这个稳定。

202.
分布式的用户信息放到session中,那么匹配session的要用redis缓存。吧sessionid放到cookie中,去每次读取,放置
可以解决用户登录问题。
在nginx中,有三种分配机器方式,1是轮询,第二权重,第三iphash,iphash用法简单,但是如果客户机用网路加固使
每次访问的ip地址不一样,那么iphash就不能用了。

203.
linux的fork机制
linux进程调用是通过fork进制,fork()比较特殊,会函数执行完会返回2个值,一个是子进程的值,为0,一个是父进程的值是子进程的id,就是说父进程需要知道自己搞出了多少子进程,方便管理。子进程可以通过getpid()来获取父进程的id。
apache服务器是每次新的http请求到达,就fork()出新的子进程进行请求的处理。

import os
pid = os.fork()

window下进程调用:
from multiprocessing import Process
import os

pi = Process(target= ,args=(”,))
pi.start()
pi.join()

大量启动线程,需要线程池,java中可以用发令枪
from multiprocessing import Pool
import os,random,time

def pooltest():
start = time.time()
time.sleep(random.random()*3)
end = time.time()
print(“run %0.2f”% (end-start))

if name ==’main‘:
print(“pid is %s”% os.getpid())
p = Pool(4)
for i in range(5):
p.apply_async(“pooltest”,args=(i,))
p.close()
p.join()
print(“end!!!!!!!!”)

子线程调用:
r = subprocess.call([‘nslookup’, ‘www.python.org’])
命令以列表的方式写入
p = subprocess.Popen([‘ping’,’192.168.10.97’],stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)

204.
线程
_thread比较底层,threading是封装_thread之后的东西。和java类似,一个实现runnable接口,一个集成Thread类。python中的锁是Lock(),java中的是synchronize。
需要了解的是一个Threading.current_thread().name,默认主线程名称是MainThread,我们可以为开启的子线程命名,如果不命名的话,系统自动命名为Thread-1,…

205.
ThreadLocal

206.
linux下的进程调度fork()消耗资源比win下稍微小,而使用多进程调度采用master+worker,master进行线程的分配,worker搞的是运行线程。多线程之间转换小号小,但是由于共享内存资源,一个线程奔溃可能会造成程序的奔溃,这也是iis服务器不稳定的原因。
对线程操作的原因选择要看实际的用途,用于打两局计算的用c写,因为小号cpu高,处理io平凡的用脚本写,代码简单。现在的趋势在搞异步线程,nginx就是代表,对cpu的利用率很高。

207.
分布式的东西,思想是一个项目分开部署,那么很多东西怎么做到一致,并且共享呢,比如session,这就涉及到共享的东西,比如java提到的中间件,分布式锁。
当然大并发也是个棘手问题,python为了大并发搞了一个process的模块,他是线程比thread好多了。
我从课本上学道的东西是a注册b,a.register(b),用队列存储线程。队列是queue。

208.
collection集合

namedtuple()
from collections import namedtuple
point = namedtuple(‘point’[‘x’,’y’])
p = point(5,6)
p.x
改函数处理简单的图形对象并给她们长宽等属性是很适合的。

list是做现行存储的,器查询快捷,但是修改则是费时间,那么对于修改我们用deque,其原理是利用双向队列的原理。
from collections import deque
p = deque([‘a’,’b’,’c’])
p.append(‘x’)
p.pop()
p.appendleft()
p.appendright()

字典
defaultdict
该字典就是设置了一个某人值,如果请求没有存在key的时候,就会输出默认值
from collections import defaultdict
map = defaultdict(lambda:’none_have_key’)
map[‘key_none’]

OrderedDict顺序输出的字典
就是一何种顺序输入,就会有何种顺序输出。为啥hash一般是无序的呢,这个和hash的存储有关。
from collections import OrderedDict
d = OrderedDict([(‘a’,1),(‘y’,5),(‘x’,6)])
print(d)即可发现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值