day8 多线程( 线程池 守护线程 锁) unittest
多线程threading(执行python文件,默认开始一个主线程)
Python多线程相当于单核多线程,多线程有两个好处:CPU并行,IO(输入输出)并行,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行(cpu的上下文切换),即使100个线程跑在100核CPU上,也只能用到1个核。线程之间是相互独立的.cpu有 几个核心就只能同时运行几个任务.
多线程:使用于IO密集型任务 多进程:适用于CPU密集型任务
在windows中启动多个进程要加上 if --name--==--main--
input/output 网盘io(网上下载上传东西) 磁盘io(数据库里写数据写文件都是在操作磁盘)CPU用来调度,消耗不大,cpu都是在等待,大部分都是磁盘在操作
数据 分析,排序,计算 使用cpu比较多,用多进程比较合适
可以用来做异步任务,比如发邮件时间久,开启一个线程去发邮件,如果发邮件时间久的化,主线程就可以优先结束任务,子线程还在运行.
1.怎么去启动一个或多个线程 2.主线程去等待子线程
2.下载图片
开启多个线程要想去拿到结果,用return 是拿不到的,把线程的结果加到 列表中[用列表把结果接收了],最后从列表中拿值就可以
线程池(电脑不能无限制的开线程,利用线程池来限制开启的线程数,运行线程)
第一步开启一个线程池,第二部 分配数据(就是运行的函数和数据加入),第三步 把数据一个一个加入到线程池
---------------------------------
三、守护线程
主线程结束,守护立马死掉。 设置成守护主线程后,主线程结束,守护也结束(不管子线程有没有运行完都结束) 俗称陪葬
----------------------------------------------
四、锁.多个线程操作同一个数据的时候就得加锁(python3在安全期间自动加锁了). 多个线程还是并行,只不过运行到加锁的数据就会轮流进行
---------------------------------------------------------------
五、多进程
multiprocessing 模块 用法和线程差不多
在windows中启动多个进程要加上 if --name--==--main--
--------------------------------------------------------
六、虚拟环境 (可以直接建立,python的虚拟的运行环境,不需要 的时候可以直接将文件夹删除)推荐使用虚拟环境
1.pip install virtualenv 安装模块 2.建一个文件夹用来存放 虚拟环境 windows cd / 进入c dir查看当前目录 cd 进入
3.执行命令(可以在pycharm中执行,也可以在cmd中) virtualenv pys 这样就建立一套环境,这个环境是一套干净的环境,没有第三方模块,里面只有pip
virtualenv --name (看这个命令下配置) 如果配置虚拟环境的时候想有自己环境的包,virtualenv name --system-site-packages
4.进入虚拟环境,进入到建好的环境目录,linux中bin进入bin,windows无bin 进入scripts .执行activate 如果是 linux中执行 source ./activate
退出的话是 deactivate
-----------------------------------------------------------------------------------------------------------------
搭建测试环境
1.申请服务器 2.安装依赖的的软件 jdk1.8 mysql redis tomcat 3.获取代码 ,修改 配置文件(编译,打包)
4.导入基础数据(建表,导入数据) 5.代码放到服务器上,启动
日常部署:开发修改完代码后。 1.拉取最新的代码 ,修改配置文件(编译打包) 2.如果有变动sql,执行 3.服务器上代码替换成最新的,重启
-------------------------------------------------------
七、单元测试 自己测自己的代码
自己写一些测试的代码,来测试自己写的代码功能有没有实现
单元测试框架 #python unittest #java junit #php phpunit
unitest 运行测试用例 是测试用例的函数要加test 最后的类不需要实例化,直接 用 unittest.main()
------------------------------------
测试报告
在python中可以把python的文件,放入环境lib中,然后import 模块 应用,也可以在pycharm中,把文件放入到 Libraries 中
HTMLTestRunner 和BeautifulReport (是个文件夹,把第二层文件夹放到python环境里) 都不在pip源上,所以需要下载
#testcase 用例 #testsuit 用例集合 #testrunner 运行测试用例 #testloader 查找测试用例
HTMLTestRunner产生测试报告
#产生测试报告的 写法,首先写好测试用例。导入模块 HTMLTestRunner,不能写 unittest.main()
file = open('report.html','wb') #首先打开一个文件夹,文件是html格式的,用来存测试报告
runner = HTMLTestRunner.HTMLTestRunner(file,title='测试报告')
test_suit = unittest.makeSuite(AddTest) #把测试用例加入到用例集合中
runner.run(test_suit) #运行测集合
file.close()
BeautifulReport 产生测试报告,比HTMLTestRunner好看些,比之前的也好些 site-packages,报错的话把路径放这个下面
import BeautifulReport as brl #太长起个别名
test_suit = unittest.makeSuite(AddTest) #生成测试集合
report = brl.BeautifulReport(test_suit) #运行集合
report.report(filename='bf_report.html',description='bf测试报告',log_path=r'C:\Users\16090\Desktop') #生成文件,标题,可以指定路径
print(report.failure_count) #失败案例的条数
print(report.success_count) #成功的案例数
当前文件的目录 os.path.abspath(__file__) 当前文件的上级目录 os.path.dirname( os.path.abspath(__file__))
--------------------------------------------
参数化导入模块 parameterized
import parameterized #输入数据驱动 自动化有三种驱动 1.数据驱动 2.代码驱动 3.关键字驱动
@parameterized.parameterized.expand(data) #parameterized 执行参数化,参数放到列表中
-----------------------
测试用例在一个文件夹中,运行测试用例
test_suite = unittest.defaultTestLoader.discover('case','*.py')
#用defaultTestLoader查找当前的文件下,的测试案例,作为测试集。
用例不在一个文件夹中,怎么把用例到导入到用例集中执行。直接传文件夹就可以,但是文件夹里的 文件夹 需为 python package .这个文件夹中有个__init__.py 的文件。(自己可以在里面写入 from . import 当前文件的模块)
--------------------------------------------
拼接url的地址 可以 用 form urllib import parse parse.urljoin(url1,url2)
url 解码,url 编码。
----------------------------------