操作系统功能:
①封装好硬件的接口
②管理进程
多道技术:两种转换
①当应用程序需要调用I/O时的空余时间(提高效率,并且实现多道技术)
②当应用程序运行时间过长,CPU会主动切换到别的应用程序(降低效率,但实现了多道)
join
让主进程卡在这个位置,等待子进程运行完后再继续往下走:p.join()
terminate
杀死进程
is_alive
判断进程是活的还是死的
p = Process(target=talk,args=(conn,))
args 里的参数要为元组形式传参
守护进程
p.daemon
必须在进程开启之前设置该进程为守护进程,在守护进程里面不可以再设置子进程
互斥锁与join的区别
互斥锁与join虽然都是把并行改为串行,都可以保证数据的安全性,但是join是把整段代码改成串行,但互斥锁只是把一小段改成串行,这就是两者之间的区别
进程与线程
进程相当于一个部门,线程是部门里面的工作人员,只有线程才是工作的,进程里面会有多线程
1、开进程的开销远大于开线程
2、同一进程内的多个线程共享该进程的地址空间
3、pid,同一进程内的线程pid是一样的,不同进程之间的pid是不同的
currentThread
currentThread().getName()查看当前的线程(进程)名字
currentThread().getpid()获取pid
Thread实例对象的方法
# isAlive(): 返回线程是否活动的。
# getName(): 返回线程名。
# setName(): 设置线程名。
threading模块提供的一些方法:
# threading.currentThread(): 返回当前的线程变量。
# threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
# threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁
GIL实际上也是一个互斥锁, 在C python解释器下用多进程,可以代替GIL产生的不足
IO运行用多线程处理,计算运行用多进程处理
递归锁可以连续的acquire多次,每acquire一次
from threading import Event event.isSet():返回event的状态值; event.wait():如果 event.isSet()==False将阻塞线程; event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度; event.clear():恢复event的状态值为False。
MySQL
停止MySQL服务:net stop MySQL
MySQL语句
#1.操作文件夹
增:
#创建一个database create database db1 charset utf8;
查:show databases;
show create database db1
改:alter database db1 charset latin1;
删除: drop database db1;
#2. 操作文件
先切换到文件夹下:use db1
增:create table t1(id int,name char);
查:show tables
改:alter table t1 modify name char(3);
alter table t1 change name name1 char(2);
删:drop table t1;
#3. 操作文件中的内容/记录
增:insert into t1 values(1,'egon1'),(2,'egon2'),(3,'egon3');
查:select * from t1;
改:update t1 set name='sb' where id=2;
删:delete from t1 where id=1;
int(宽度) 不是存储宽度 而是显示宽度,即查看时的显示宽度select * from t1
show table 查看表
官网解释如下
char是定长 #取数据时会把后面的空格自动去掉 如果char(5),放进去若不够5个,但是存进去时也会变5个字符,但是取出来时会自动帮你删除后面的空格,若存2,显示5个,但取出来时会是2个
varchar是变长 #取数据时保留后面的空格 头需要1byte 表示数据大小,但也可以2bytes 表示数据大小 65535
char_length(name) #可以查看name 字符 有多少个字符
优缺点:
char :存放粗暴,存取性容易,但浪费空间 一般选用char使用
varchar:存取都比较麻烦:先存取头,再拿数据,但是可以节省空间
略施小计,让char现出原形
mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'
desc 表名:查看表的详细信息
order by asc 默认就是升序
desc 降序
联合唯一unique
修改MySQL密码:
首先stop MySQL:net stop MySQL
然后通过mysqld 启动 服务端 并且需要跳过默认的授权表:
mysqld --skip-grant-tables (跳过授权表
启动)
这时再打开另一个cmd,输入mysql 启动
设置相对应的账号和密码:
update mysql.user set password=password("123") where user="root" and host="localhost" 其中
执行后报错 ERROR 1054(42S22) Unknown column 'password' in ‘field list’
错误的原因是 5.7版本下的mysql数据库下已经没有password这个字段了,password字段改成了authentication_string
所以请使用一下命令:
update mysql.user set authentication_string=password("123") where user="root" and host="localhost";
password=password("123") 是利用mysql里的密码功能,这样存进去的就不是明文了,实际上与password="123"同理
设置完后需要管理员启动cmd 杀死 mysql进程后重新再启动
查看进程:tasklist |findstr mysql
杀死进程:taskkill /F /PID 8752(进程名)
#本地账号
create user 'egon'@'localhost' identified by '123';#mysql -uegon1 -p123
#远程账号
create user 'egon2'@'192.168.31.10' identified by '123';#mysql -uegon2 -p123 -h 服务端ip
create user 'egon2'@'192.168.31.%' identified by '123';#mysql -uegon2 -p123 -h 服务端ip
create user 'egon2'@'%' identified by '123';#mysql -uegon2 -p123 -h 服务端ip
2.授权
user #用户级别
db #数据库级别
tables_priv #表级别
columns_priv #数据级别
视图:
创建视图:create view table1 as select * from student; #创建一个表,把几个复杂的表连接起来,创建一个虚拟表
修改:alter view table1 as select .......
删除:drop view table1
delimiter // # 设置mysql结束符为// 不为;