本周内容总结

线程理论

#进程
	进程其实是资源单位 表示一块内存空间
#线程
	线程才是执行单位 表示真正的代码指令
    
我们可以将进程比喻成车间 线程是车间里面的流水线
'''一个进程内部至少有一个线程'''

1.一个进程内可以开设多个线程
2.同一个进程下的多个线程数据是共享的
3.创建进程与线程的区别
	创建进程的消耗要远远大于线程

线程的诸多特性

1.join方法
2.同进程内多个线程数据共享
3.current_thread()
4.active_count()

GIL全局解释器锁

# 官方文档对GIL的解释
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.
'''
1.在cpython解释器中存在全局解释器锁简称GIL
	python解释器有很多种
		Cpython Jpython Pypython (常用的是Cpython解释器)
2.GIL本质也是一把互斥锁 用来阻住同一个进程内多个线程同时执行(重要)
3.GIL的存在是因为CPython解释器中内存管理不是线程安全的(垃圾回收机制)
垃圾回收机制
	引用计数、标记清除、分代回收
'''

GIL与普通互斥锁

#GIL只能确保同进程内多线程数据不会被垃圾回收机制弄乱
	并不能确保程序里面的数据是否安全 所以普通互斥锁还是不能少的

python多线程是否有用

需要分情况
#情况一
	单个cpu
	多个cpu
#情况二
	io密集型(代码有IO操作)
 	计算密集型(代码没有IO操作)
1.单个cpu
	IO密集型
    	多进程:申请额外的空间 消耗更多的资源
  		多线程:消耗的资源相对较少 通过多道技术
 	计算密集型
    	多进程:申请额外的 消耗更多的资源
     	'''总耗时+申请空间+拷贝代码+切换'''
     	多线程:消耗资源效果对较少 通过多道技术
2.多个cpu
	IO密集型
    	多进程:总耗时(单进程耗时+IO+申请空间+代码拷贝)
     	多线程:总耗时(单进程耗时+IO)
 	计算密集型
    	多进程:总耗时(单进程的耗时)
     	多线程:总耗时(多个线程的综合)

死锁现象

"""
出现前提:当有两把及以上的锁 抢的时候固定了时间顺序 并在抢锁时候是一个循环过程
eg:规定了锁A和锁B 只有先抢锁A才能抢锁B 并且抢完锁A需要再去抢锁B

当多个进程去抢的时候 只要有进程抢到了锁B 那么就一定会释放锁A 
这个时候锁B和锁A都没有被释放 但是都想去抢 就会被卡住 代码将停止 但不会终止运行 这就是死锁现象
"""

信号量

在python并发编程中信号量相当于多把互斥锁(公共厕所)

semaphore(数量) #就可以产生对应数量的锁

semaphore是一个内置模块 需要导入

event事件

使用代码可以实现让两个进程相互等待
#进程执行到wait需要等待另一个进程执行到set才可以就继续执行

进程池与线程池

#池
	降低程序的执行效率 但是保证了计算机硬件的安全性
#进程池
	提前创建好固定数量的进程供后续程序的调用 超出则等待
#线程池
	提前创建好固定数量的线程供后续程序的调用 超出则等待
    
#创建池的意义:
 	如果无限制的创建进程和线程 是有物理上的极限的 创建线程和进程是需要损耗一定的内存的 无线的创建可能会导致计算机崩溃
    
#代码
	创建进程池和线程池需要用到模块
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor

pool = Threadpooexecutor(数量)
pool = ProcessPoolExecutor(数量)

协程

'''
进程:资源单位
线程:执行单位
协程:单线程下实现并发(效率极高)
	在代码层面欺骗CPU 让CPU觉得我们的代码里面没有IO操作
	实际上IO操作被我们自己写的代码检测
	留住CPU 让CPU保持着运行 无法停下自然效率高
'''
#代码:
import time
from gevent import monkey;

mokey.patch_all()  # 固定编写 用于检测所有得IO操作(猴子补丁)
def func1():
    print('func1 running')
    time.sleep(3)
    print('func1 over')


def func2():
    print('func2 running')
    time.sleep(5)
    print('func2 over')


if __name__ == '__main__':
    start_time = time.time()
    # func1()
    # func2()
    s1 = spawn(func1)  # 检测代码 一旦有IO自动切换(执行没有io的操作 变向的等待io结束)
    s2 = spawn(func2)
    s1.join()
    s2.join()
    print(time.time() - start_time)  # 8.01237154006958   协程 5.015487432479858

存储数据的多种方式

#1.文本文件
出现的问题:
    文件路径不固定
    数据格式不统一
#2.软件开发目录规范
出现的问题
	数据格式还是没统一
#3.数据库服务
	统一路径 统一操作方式
    降低了学习成本 提高开发效率

数据库

数据库的本质

1.站在底层原理角度
	数据库指的是操作数据的进程(一推代码)
2.站在实际应用的角度
	数据库指的是可视化操作界面(一些软件)
 
数据库软件的本质也是CS架构的程序
	意味着所有的程序员其实都有资格编写一款数据库软件

数据的分类

1.关系型数据库
	特征一:拥有固定的表架构(字段名 字段类型)
  	特称二:数据之间可以建立数据库层面的关系
2.非关系型数据库
	特征一:没有固定的表结构 数据存储采用K:V键值对的形式
 	特征二:数据库之间无法建立数据库   层面的关系

mysql简介

#主要目录介绍
	bin目录
    	存放启动文件
        	mysqld.exe(服务端)    mysql.exe(客服端)
 	data目录
    	存放核心数据
   	my-default.ini
    	默认的配置文件(使用需要复制一封)
    readme
    	软件说明

mysql基本使用

cmd建议你使用管理员身份打开

1.切换到mysql的bin目录下先启动服务端
	mysqld
2.保持窗口不关闭 重新打开一个新的cmd窗口
3.切换到mysql的bin目录下启动客户端
	mysql
'''
直接使用mysql命令默认是游客模式 权限和功能都很少
	mysql -u用户名 -p密码
管理员默认没有密码
	mysql - uroot -p
'''

系统服务的制作

1.先把bin目录添加到环境变量
	清空之前打开cmd窗口 一定要把之前用cmd启动的服务端关闭(ctrl+c)
2.将mysql添加到系统服务中
	1.如何查看系统服务
    	鼠标右键任务栏选择服务
        cmd输入services.msc 
 	2.以管理员身份打开cmd窗口
    	musqld --install
3.首次添加不会自动启动 需要人为操作一下
	1.鼠标右键启动
  	2.命令行启动
    	net start mysql
'''
如果想要卸载重新安装
	1.先关闭服务端
		net stop mysql
	2.移除系统服务
		mysqld --remove
'''

密码相关操作

1.修改密码
	方式一:musqladmin
        	mysqladmin -u用户名 -p原密码 password 新密码
  	方式二:直接修改存储用户数据的表
  	方式三:冷门操作 有些版本不支持
        set possword=password('新密码') #修改当前登录用户的密码
2.忘记密码
	方式1:卸载重新装
  	方式2:把data目录删除 拷贝别人的目录
 	方式3:小把戏操作
		1.关闭正常的服务端
   		2.以跳过授权表的方式重启服务端(不校验密码)
    	3.以管理员身份进入然后修改mysql.user表数据即可
         net stop mysql
      	 mysqld --skip-grant-table
      	 mysql -uroot -p
	     update mysql.user set password=password('123')

sql与nosql

数据库服务端是可以服务多种类型的客户端
	客户端可以是自己开发的 也可以是python、java代码写的
sql
	操作关系型数据库的语言
nosql
	操作非关系型数据库的语言
ps:要想跟数据库交互就必须用数据库指定的语言
    
'''
sql和nosql有时候也可以相互指代
'''

数据库的重要概念

库 >>> 相当于是文件夹
表 >>> 相当于文件夹里面的文件
记录 >>> 相当于文件夹的文件中的一行行数据

基本sql语句

# sql语句必须是以分号结尾

'''基于库的增删改查'''
1.创建库
	create database 库名;
2.查看库
	show databases; 		 # 查看所有库的名称
    show create database 库名; # 查看指定库信息(可以查看到更多)
3.编辑库
	alter database 库名 charset='utf8';
4.删除库
	drop database 库名;
  
'''基于表的增删改查'''
操作表之前需要先确定库
	create database db1;
切换操作库
	use 库名;
1.创建表
	create table 表名(字段名 字段类型,字段名 字段类型)
2.查看表
	show tables; # 查看库下所有的表名称
  	show create table 表名; # 查看指定表信息
    descride 表名; # 查看表结构
    desc 表名;
    ps:如果想跨库操作其他表 只需要在表名前加库名即可
        desc mysql.user;
3.编辑表
	alter table 表名 rename 新表名;
4.删除表
	drop table 表名;
 
'''基于记录的增删改查'''
1.插入数据
	insert into 表名 values(数据值1) # 插入数据值时对应上字段名
2.查询数据
	select * from 表名; # 查询表中所有的数据
3.编辑数据
	update 表名 set 字段名=新数据 where 筛选条件;
4.删除数据
	delete from 表名;
    delete from 表名 where id=2;

字符编码与配置文件

1.\s查看Mysql相关信息
	当前用户、版本、编码、端口号
	mysql 5.6以及之前的版本编码需要认为统一 之后的版本默认统一
    如果想要永久修改编码配置 需要操作配置文件
2.默认的配置文件时my-default.ini
	拷贝上述文件并重命名为my.ini
 	
直接拷贝字符编码相关配置即可无需记忆
	[mysqld]
        character-set-server=utf8mb4
        collation-server=utf8mb4_general_ci
    [client]
        default-character-set=utf8mb4
    [mysql]
        default-character-set=utf8mb4
ps:
    1.utf8mb4能够存储表情 功能更强大
	 2.utf8与utf-8是有区别的 MySQL中只有utf8
 
修改了配置文件中关于[mysqld]的配置 需要重启服务端

数据库存储引擎

存储引擎
	数据库针对数据采取的多种存取方式
   
查看常见存储引擎的方式
	show engines;
    
#需要了解的四个存储引擎
	myisam
    	mysql5.5之前默认的存储引擎
        存储数据的速度快 但是功能较少 安全性较低
        
  	InnoDB
    	mysql5.5之后默认的存储引擎
        支持事务、行锁、外键等操作 存储速度没有myisam快 但安全性高
        
 	memory
    	基于内存存储数据 仅用于临时表数据存取
    
   	balckhole
    	任何写入进去的数据都会立刻丢失
        
#了解不同存储引擎底层文件个数
	create database db2;
 	use db2;
	create table t1(id int) engine=innodb;
 	create table t2(id int) engine=myisam;
  	create table t3(id int) engine=memory;
 	create table t4(id int) engine=blackhole;
	'''
	1.innodb两个文件
		.frm	表结构
		.ibd	表数据(表索引)
	2.myisam三个文件
		.frm	表结构
		.MYD	表数据
		.MYI	表索引
	3.memory一个文件
		.frm	表结构
	4.blackhole一个文件
		.frm	表结构
	'''

创建表的完整语法

create table 表名(
	字段名 字段类型(数字) 约束条件,
  	字段名 字段类型(数字) 约束条件,
  	字段名 字段类型(数字) 约束条件
)
1.字段名和字段类型是必须 至少写一个
2.数字和约束条件是可选的
3.约束条件也可以写多个 空格隔开即可
4.最后一行结尾不能加逗号

字段类型

整型

tinyint		1bytes
smallint	2bytes
int			4bytes
bigint		8bytes

验证整形默认是否携带正负号
	create	table t5(id tinyint);
    insert into t5(-129),(128);
结果为-128 127 也就意味着默认自带正负号

我们也可以取消正负号
	create	table t5(id tinyint unsigned);

严格模式

当我们使用数据库存储数据得时候 如果数据不符合规范 应该直接报错而不是擅自修改数据 这样会导致数据得失真(没有实际意义)
	正常都应该报错 但是我们修改了配置文件
    
show varables like '%mode%';

1.临时修改
	set session sql_mode='strict_trans_tables';
    	在当前客户端有效
 	set global sql_mode='strict_trans_tables';
    	在当前服务端有效 
2.永久修改
	直接修改配置文件

浮点形

float(20,10)
double(20,10)
frcimal(20,10)
第一个数字的意义是数字的位数
第二个数字的意义是小数点后面的数字位数

三者的核心区别在于精确度不同
	float < double < decimal

字符类型

char  # 定长
	char(数字) 最多可存储的字符个数 超出则报错 不够就用空格填
varchar # 变长
	varcher(数字) 最多可存储的字符个数 超出则报错 不够则存输入的
    
char 对比 varchar
	char
    	优势:整存整取 速度快
    	劣势:浪费存储空间
  	varcher
    	优势:节省存储空间
     	劣势:存储数据的速度较慢
'''需要结合具体运用场景'''            

枚举与集合

# 枚举
	多选一
    enum(数据值一,数据值二,数据值三)
    在传入数据时只能传入括号中的数据值中的一个
# 集合
	多选多
    set(数据值一,数据值二,数据值三)
    在传入数据时只能传入括号中的数据

日期

datetime		年月日时分秒
date			年月日
time			时分秒
year			年

无符号、零填充

unsigend
	id int unsigend
zerofill
	id int(5) zerofill

非空

在定义字段的时候在后面加上约束条件>>>not null
可以限制在传入数据的时候不可为空 ''不算空  NULL才是

默认值

在字段类型后面写上 default '默认数据'
在传入该字段数据时 如果没有写入数据 则会默认添加上默认数据

唯一值

'''单列唯一'''
在字段类型后面加上unique
在传输数据时 不能传入该字段中已有的数据
'''联合唯一'''
unique(字段) 
在需要联合的字段写入 传入数据时数据不能与被联合的一模一样 可以联合中的某个或多个字段一样 但是不能全一样

主键

1.单从约束层面上而言主键想当于not null + unique(非空且唯一)
2.InnoDB存储引擎规定了所有的表必须有且只有一个主键(主键是组织数据的重要条件并且主键可以加快数据的查询速度)
'''
当表中没有主键也没有其他非空且唯一的字段下
	InnoDB会采用一个隐藏的字段作为表的主键 隐藏意味着无法使用基于该表的主键查询只能一行行查找 速度很慢
'''

自增

auto_increment
自增一般是配合主键一起使用的
'''
自增特性
	自增不会因为数据的删除而回退 永远自增往前
	如果自己设置了更大的数 则之后按照更大的往前自增
'''

关系判断

一对多关系

以员工表和部门表为例
	1.先站在员工表的角度
    	问:一名员工能否对应多个部门
       答:不可以
 	2.再站在部门表的角度
    	问:一个部门能否对应多名员工
     	答:可以	
	结论:一个可以一个不可以 那么关系就是'一对多'
	针对'一对多'关系 外键字段建在'多'的一方

外键字段的建立

1.创建表的时候一定要创建被关联表
2.录入表数据的时候一定要先录入被关联表
3.修改数据的时候外键字段无法修改和删除

针对3 有简化措施>>>:级联更新级联删除
    on update cascade(级联更新)
    on delete cascade(级联删除)
    
'''
外键是强耦合 不符合解耦合的特性
	所以很多时候 实际项目中当表较多的情况 我们可能不会使用外键 而是建立代码层面的关系
'''

多对多关系

以书籍表与作者表为例
	1.先站在书籍表的角度
  		问:一本书能否对应多个作者
      答:可以
 	2.再站在作者表的角度
    	问:一个作者能否对应多本书
      	答:可以
#结论:两个都可以 关系就是'多对多'	
#针对'多对多'不能在表中直接创建 需要新建第三张关系表

一对一关系

以用户表与用户详情表为例
	1.先站在用户表的角度
  		问:一个用户能否对应多个用户详情
      答:不可以
 	2.再站在用户详情表的角度
    	问:一个用户详情能否对应多个用户
      	答:不可以
#结论:两个都可以 关系就是'一对一'或者没有关系	
#针对'一对一'外键字段建在任何一方都可以 但是推荐建在查询频率较高的表中

sql语句查询关键字

select
	select * # 查询所有字段
  	select name	# 查询name字段
  	select char_length(name)  # 查询name字段的字节长度(支持处理)
 
from
	指定需要查询的表信息

编写sql语句的小技巧

针对select后面的字段名可以先用*占位 最后再回来修改

在实际运用中select后面很少直接写* 一次性读取多有的字段非常浪费数据库资源

查询关键字之where筛选

类似于if判断在sql语句做一个筛选作用
# 代码格式
select 字段名 from 表名 where 筛选条件;

查询关键字之group by分组

分组:按照指定的条件将单个单个的数据组成一个个整体
    
#分组的目的是为了更好的统计相关数据

#聚合函数
	专门用于分组之后的数据统计
    max\min\sum\avg\count
    最大值、最小值、求和、平均值、计数
    
#代码格式
select 字段名,聚合函数 from 表名 group by 按照分组字段名;
"""
MySQL5.6默认不会报错
set global
sql_mode='strict_trans_tables,only_full_group_by'
MySQL5.7及8.0默认都会直接报错
	原因是分组之后 select后面默认只能直接填写分组的依据 不能再写其他字段
		select post from emp group by post;
		select age from emp group by age;		
分组之后默认的最小单位就应该是组 而不应该再是组内的单个数据单个字段
"""

查询关键字之having过滤

having和where本质是一样的 都是用来对数据做筛选
	where是数据的第一次筛选(首次筛选 在分组之前)
    having是分组之后的筛选(二次筛选)
#代码格式
select 字段名,聚合函数 from 表名 where 筛选条件 group by 分组字段名 having 二次筛选条件;

查询关键字之distinct去重

注意:
    去重操作如果联合 那么只会去掉数据和联合字段全部一样的数据
'''数据必须一模一样才可以去重'''
#代码格式
select distinct 字段名 from 表名;

查询关键字之order by排序

#排序顺序
	默认是升序(asc)
  	asc可以不屑
  	desc是降序
#代码格式
sleect * from 表名 order by  字段名 asc;
'''
排序支持多字段 写入时空格隔开 
asc代表升序可以不写
可以将asc替换成desc就变成了降序
'''

查询关键字之limit分页

#意义
	如果不想展示所有的数据 可以进行分页操作
    
#代码格式
select * from 表名 limit 数字;
'''
数字的意义:
	一个数字:限制展示的数据条数
	两个数字:第一个为起始条数 第二个为结束条数
''' 

查询关键字之regexp正则表达式

#代码格式
select  * from emp where 筛选条件 regexp 正则表达式;

多表查询思路

表数据准备
create table dep(
  id int primary key auto_increment,
  name varchar(20) 
);

create table emp(
  id int primary key auto_increment,
  name varchar(20),
  sex enum('male','female') not null default 'male',
  age int,
  dep_id int
);

#插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营'),
(205,'财务');

insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('dragon','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204);

select * from emp,dep; # 先产看两张表中的所有数据对应一遍
'''
这个现象我们也称之为'笛卡尔积'无脑的对应没有意义 应该将有关系的数据对应到一起才合理
基于笛卡尔积可以将部门编号与部门id相同的数据筛选出来
涉及到两张及以上的表时 字段很容易冲突 我们需要在字段前面加上表名来指定
'''
select * from emp,dep where emp.dep=dep.id;

原文地址:http://www.cnblogs.com/clever-cat/p/16930234.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性