冒出来一个念头. Python del 对象时,会自动调用__del__
方法。那么垃圾回收的时候,是否python也会在删除对象前,调用__del__
方法呢?结论是不会,模拟了一个例子,便看到答案了。可是为什么呢?
1 | class XX: |
del 命令删除的实际上对象的引用。但是删除前会调用
__del__
,完成方法里定义的善后工作。python的垃圾回收,删除的是引用计数。所以并不会调用
__del__
方法
冒出来一个念头. Python del 对象时,会自动调用__del__
方法。那么垃圾回收的时候,是否python也会在删除对象前,调用__del__
方法呢?结论是不会,模拟了一个例子,便看到答案了。可是为什么呢?
1 | class XX: |
del 命令删除的实际上对象的引用。但是删除前会调用__del__
,完成方法里定义的善后工作。
python的垃圾回收,删除的是引用计数。所以并不会调用__del__
方法
Python 导入都有哪几种写法呢?
1 | from xxx import yyy, zzz //此处的yyy可能对应xx/yyy.py文件。 也有可能是xxx.py中的一个变量。 |
应该是去年,下班路上的一个想法,一直记在备忘录,没来的及去求证。如今答案应该很清晰了。
我们内部把S3通过工具,mount 在ec2上,当成本地磁盘,用于写入备份数据库文件。于是我便产生了一个疑问,如果这个“磁盘”中,一个数据库备份sql 文件,假设100G,现在我用sed替换其中一个字符串,会产生什么影响呢。按照下文的说法,预计会导致重新上传这个文件。通过监控磁盘流量,或者存盘的时间,应该也可以观测出。
公司中层管理的课程,实在是太糟心了。逼迫在短期内,学习大量的管理课程。于是动了“歪脑筋”,想着抓下来,慢慢回顾。
mitmproxy 在新的版本中,已经不再支持使用 P 就复制出python request 脚本,或者curl 命令了。现在采用的是command的方式。但获得请求的curl命令,还是非常常用的需求。
通过配置keys.yaml,就能实现。
1 | ➜ cat ~/.mitmproxy/keys.yaml |
python 查看变量大小
sys.``getsizeof
(object[, default])
解包
1 | a, *mylist = 1,2,3,4,5 |
python -c “print(‘Hello World’)”. //python 命令行,直接执行python代码
Python -m http.server // -m mod : run library module as a script (terminates option list)。
1 | /tmp/test/run.py 内容如下: |
python的私有化
单一个下划线开头的变量,如_var,类对象/子类都可以访问到,但是from somemodule import * 禁止导入。
双下划线开头的变量,如__var,类对象/子类都访问不到。from somemodule import * 禁止导入。
1 | //特别注意一下这种,是可以访问到的 |
字典
首先,字典和列表都是可变变量。
字典是无序的,查找和插入的时间,不会随着数据增加而增加,但是占用空间大。
而列表时有序的,查找和插入的时间,随着数据增加而增加,但是空间浪费少。字典的key必须是不可变对象,因为dict存储或是查找时, 都是通过对key进行哈希算法计算,得出value所存储的位置。如果key也可以变,那就乱套了。
1 | 1, 2, 3] key = [ |
method方法 & function函数
1 | // function 指的是普通的函数。比如: |
![image-20200606144203893](https://tva1.sinaimg.cn/large/007S8ZIlgy1gfikcyn7ugj31e20u01kx.jpg)
精度问题,是的,javascript也有这个问题,原因是小数通过二进制保存,巴拉巴拉的。。。 😁
1 | In [10]: x = 0.1 |
结论:如果需要精度非常高的,decimal 是一个选项, 但是日常总是免不了遇到浮点型的数据操作。面对这种日常场景如何处理呢。
Python 枚举
刷TypeScript的时候,遇到了枚举类型。我突然意识到Python中,基础的数据类型中,没有枚举。
1 | // enum 只有在python v3.4 才开始有 |
python 默认数据类型有数组吗?在Typescript中是有数组的。我起初以为list,没有二维数组。
Note: Python does not have built-in support for Arrays, but Python Lists can be used instead.
答案是没有,python的list并不是数组,
1 | 如下list也是支持多维 |
重点:list中的数据类型保存的是数据所存放的地址,简单的说就是指针,并非数据,这样保存一个list就太麻烦了,例如list1=[1,2,3,’a’]需要4个指针和四个数据,增加了存储和消耗cpu。
1 | numpy 会更灵活,也支持多维 |
python 使用@property, 切记使用@property所使用的必须是收保护的。
1 | class Student(): |
1 | import sys |
于是,做了一个小测试,结果让我有点傻眼。
1 | try: |
1 | try: |
回到开头的问题 sys.exit(0) 与 sys.exit(1) 的区别,都会raise SystemExit异常,但是区别在于程序的返回码。
sys.exit(0) 为正常退出,echo $?,结果为0
sys.exit(1) 为非正常退出,echo $, 结果为1
题外话:如何查看类的父类:
1 | In [2]: Exception.__bases__ |
经历了漫长的迭代,终于需要重新创建AWS VPC的时候了。现有的VPC在我入职前就已经存在,虽然取名标示私有子网,但是却附加了互联网网关, 完全丧失了意义,主要原因便是开发需要连接到“私有子网”的数据库。现在的我当然知道ELB,ssh隧道都可以转发解决🥴。现在由于想要为生产Kubernetes,规划的一个VPC,因此就开始了回顾VPC。
创建一个VPC,面临一个决策,VPC内的子网划分,是否有必要划分public或private 子网。组里的同事,认为无需再划分private区域了。通过我们现有的安全组规划,就可以实现隔离。并且开发同事总有需要连接到private subnet里资源的时候,比如之前的private 区域的RDS,最终还是添加了互联网网关。我权衡再三,决定还是将子网划分出两个网段,理由如下:
a. Public 与Private 子网。public子网充当DMZ区,作为面向互联网外部访问的网段,常常用于架设网页服务器,ELB均衡器。而private 意味是内部安全资源,仅仅允许内部访问。
b. 如果不划分Private子网,意味所有主机访问互联网,都需要添加一个公有IP,或者弹性IP。ipv4毕竟是有限资源,而且弹性IP本来就有limit,每次超过限制,都需要申请。
c. private子网内的资源,未来需要被访问,需要额外的负载均衡器。
AWS 的VPC Best Practice的架构图,非常有借鉴意义。设计时候,要考虑现有的办公网段,毕竟未来随时有可能在新的region创建VPC
创建NAT GATEWAY
两种方式: 1. 自己用EC2搭建 2. 采用托管的NAT GATEWAY。健壮性考虑,我们选用了第二种。
设置private 子网的路由策略。
如上图Route53,dns的解析 dev1-dop.nearbydirect.com 返回来的是dop-gateway-web-dev1.dop-dev1.svc.cs-software.local。然后客户端再发起dop-gateway-web-dev1.dop-dev1.svc.cs-software.local的解析请求。误区:并不是由ns服务器完成全部解析将最终ip返回给客户端
今天这个错误,犯的让我自己自己生自己气了。😠😠😠
提交代码后,由kubernetes中的gitlab-runner,编译构建发布。光是想想就好鸡冻了,对不对。如果gitlab-runner 也直接在kubernetes 中,随着任务量的变动而自动伸缩,多美妙啊。
部署gitlab runner
1 | gitlab-runner chart的value文件,最重要是修改gitlabUrl, 与注册token。 |
下一步在代码仓库中,配置k8s集群的信息。企业版可以对不同的环境配置做权限管控以及owner才有的发布控制,强烈推gitlab企业版。
接下来就是让gitlab runner 跑起来印证咯。
代码仓库中,创建.gitlab-ci.yml。
1 | #variables: |