DAY9 - 析构函数,继承,多线程

析构函数

析构函数是就是在运行完之后,会自动运行的函数:
输出为:
可用于数据库或者文件的打开和关闭:
 

私有函数

在函数名或者变量名之前加__,这个函数或者变量会成为私有的,私有只能在类里调用
会有报错的输出:
 

装饰器

在类名前加一个@classmethod,这是装饰器。装饰器的作用是用来改变原来函数的功能,不改变原来的函数,给函数添加新功能:
  1. 不实例化,直接用类名调用
  2. 实例化一下,通过实例调用OK
  3. 实例也可以直接通过self.xx来使用类方法
  4. 类方法里面它是不能用这些实例方法和实例变量
输出为:
 
 

静态方法

  • 就是一个普通的函数,只是定义在类里面了而已
  • 不能用实例方法,用不了实例变量,也用不了类方法,类变量
  • 也不需要实例化,直接类名调用即可

属性方法

看起来像变量的一个函数:
1. 实例方法
2. 它不能有入参
3. 用它的时候,直接m.func,把它当成一个变量用就OK了,不需要加括号调用
4. 它是获取函数的返回值
返回为:
 
 

面向对象三大特色:继承,封装,多态(PYTHON不支持多态)

  • 继承

子类会继承父类的所有方法和变量
如果子类又一个和父类一样的方法
比如:
这样子类调用的是自己的方法。所以子类会先从本类寻找所调用的变量或者方法,如果找不到再去父类找。
继承的作用是为了简化代码,比如:
再这里,第二个类可以直接用父类的东西。
在子类的构造函数里调用父类的方法:
老师给出了一个流程的详细解释:
现在基本使用的是用super()来调用:
 

怎么搭建测试环境

第一次搭建测试环境
  1. 安装依赖软件mysql,redis,tomcat,nginx,jdk,数据库,中间件等
  2. 获取代码svn git
  3. 编译(java c)
  4. 导入基础数据
  5. 修改配置文件
  6. 启动项目
 
日常部署
  1. 获取最新代码
  2. 编译
  3. 执行sql(如果数据库又改变的话)
  4. 修改配置文件
  5. 重启项目
 

多线程,多进程

进程:一个进程相当于一个程序
线程: 线程就是进程里面的最小的执行单元。
         线程是在进程里面,干活的还是线程。
         一个进程里面最少又一个线程,可以又多个线程
没有真正意义上的并发,你的电脑cpu是几核的,那么最多只能同时运行几个任务
例如:
可以写一个循环来实现这种多线程:
遇到原有函数需要传参的情况,则做如此处理,但是这里需要传入的必须是一个元组,元组里只有一个参数的话,必须要带一个都好,不然就变成了字符串了
如果函数里是有返回值,例如return name,在线程中是获取不到的。如果要获取到的话,可用以下方式:
  1. 定义一个全局变量LIST
  2. 将多线程运行的结果放置入这个LIST,这样在整个线程结束后,这个LIST保存了所有的返回结果。
如果我们在这里尝试计算线程运行的时间:
这里的输出结果为:
为什么这里的时间和咱们sleep的时间不相符,并且all_res是空的呢?
这是因为, 线程本身也是一个线程,所以实际上干活的一共有11个线程
每个线程之间都是互相独立的,例如:
在这里say和run是两个独立的线程。所以最后算出来的end-start的时间只是线程分配好的时间,即是主线程工作的时间,并不是所有线程运行完的时间。相应的,在此时拿到的all_res也是主线程完成以后就打印出来的结果,并不是所有线程完成以后所得到的结果。
如果我们用t.join()来实现等待线程运行
加上Join之后的输出为,这里是不太对的,这里又变成了串行,我们后面再说怎么处理。
我们可以用下面的方法,如果活动的线程数不等于1,则pass:
输出为:
还有另一种方法来实现这种等待:
先定义一个线程list,把所有的子线程依次放入这个list,然后另起一个循环来t.join()等到所有子线程完成:
有关current_thread():
输出为:
 

守护线程

守护线程就是和秦始皇的陪葬的人一样
主线程就是秦始皇
子线程就是陪葬的人
例如:
输出为:
应用场景:浏览器,QQ。
 
Python里面的多线程,是利用不了多核CPU的,只能利用一个核心的CPU。
有些情况下,你用多线程的时候会发现你比单线程速度还慢
  1. 为什么python的多线程利用不了多核cpu,它还是比单线程要快呢?
python的多进程是可以利用多核cpu的
 

因为线程是同时再操作同一个东西,可能就会出现错误,比如:
这个例子,因为线程同时在操作Num这个变量,在py3中会自动上锁,但是在py2中就会得出99的结果
我们在这里加一把锁:
多个线程在操作同一份数据的时候,最好加上锁。
另一个写法, 用with可以自动加锁和解锁:
 

线程池

多进程

进程池:
 

何时用线程,何时用进程:

多线程任务适用于IO密集型任务
    磁盘IO Input output
    网络IO 
多进程任务适用于CPU密集型任务
    比如数学计算的,排序这种需要CPU干活的任务
    
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/yonnia/p/9415975.html