第四模块考核复习

进程:
正在进行的一个过程或者说一个任务,负责执行任务的是cpu,进程用来把资源集中到一起,进程是资源单位,或者说是资源集合
线程:
线程是cpu的执行单位,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
多线程和多进程的区别:
0、创建进程的开销远大于创建线程的开销。
1、开启速度 在主进程下开启线程比 开启子进程快 (线程:线程先执行,在执行进程程序)
2、pid 对比:在主进程下开启多个线程(进程和线程pid相同);在主进程下开启子进程(pid不相同)
3、同一进程内的线程共享该进程的数据(进程之间的地址是隔离的;同一进程内的线程共享该进程的地址空间)
协程:
协程:是单线程下的并发,又称微线程,纤程。
协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。
优点如下:
1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级
2. 单线程内就可以实现并发的效果,最大限度地利用cpu
缺点如下:
1. 协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程
2. 协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程
协程的适用场景: 当程序中存在大量不需要CPU的操作时(IO),适用于协程;
进程池与线程池作用:
# 为什么建池 :我们必须对服务器开启的进程数或者线程数加以控制,让机器在一个自己可以承受的范围内运行
# 这就是进程池或线程池的作用
协程与线程的区别:
协程:单线程下的并发。协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。 
  1.python的线程是属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他的线程运行) 
2.单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(!!非io操作的切换与效率无关)
GIL锁是什么鬼?
GIL即全局解释器锁,全局解释器锁的存在,在同一时间内,python解释器只能运行一个线程的代码,这大大影响了python多线程的性能。而这个
解释器锁由于历史原因,现在几乎无法消除。
有了GIL的存在,同一时刻同一进程中只有一个线程被执行
进程间通信方式有哪些?
进程间通信(IPC),消息队列(队列 = 管道 + 锁),管道(使用消息传递的)
信号量,套接字(socket),Event,定时器
什么是并发和并行?
答:并发是指一个处理器同时处理多个任务。
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。
伪并行,单个cpu+多道技术,所用的方法是多路复用:时间上+空间上
时间上:当一个程序遇到io,可以去执行另外一个程序
空间上:程序之间的内存必须分割,这种分割需要硬件层面实现,由操作系统控制。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
守护进程和守护线程的区别
守护进程,等主进程执行结束,守护进程被回收(守护进程不会执行)
守护线程,在其他非守护线程结束后才算允许完毕,守护线程在此时被回收(因为线程开销小,开启速度快,守护线程也会被执行)
线程锁和进程锁
答: 线程锁: 大家都不陌生,主要用来给方法、代码块加锁。当某个方法或者代码块使用锁时,那么在同一时刻至多仅有有一个线程在执行该段代码。
当有多个线程访问同一对象的加锁方法 / 代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该代码段。
但是,其余线程是可以访问该对象中的非加锁代码块的。
  进程锁: 也是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的,
但是可以使用本地系统的信号量控制(操作系统基本知识)。
同步与异步
同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用时,一直等待函数完成,而进程继续处于激活状态。
异步:是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行,函数返回的时候通过状态、通知、事件等方通知进程任务完成。
阻塞与非阻塞:针对的是进程或线程,阻塞是当前请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程
 调用blocking IO会一直block住对应的进程直到操作完成,而non-blocking IO在kernel还在准备数据的情况下会立刻返回。
同步和异步的区别是遇到IO请求是否等待。阻塞和非阻塞的区别是数据没准备好的情况下是否立即返回。同步可能是阻塞的,也可能是非阻塞的,而非阻塞的有可能是同步的,也有可能是异步的。
blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了

9. MySQL索引种类
1. 主键和外键的区别?
 char和varchar的区别?






MySQL
库、表、字段、数据
Mysql常用的数据类型:数字、字符串、时间类型、枚举类型和集合类型
事务的四大特征:
事务具体四大特性,也就是经常说的ACID :
1.原子性(所有操作要么全部成功,要么全部失败回滚)
2.一致性(事务执行之前和执行之后都必须处于一致性状态。)
3.隔离性(数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离)
4.持久性(一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即使遭遇故障依然能够通过日志恢复最后一次更新) 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
Mysql中varchar与char的区别
char是一种固定长度的类型,varchar则是一种可变长度的类型
char(50): 定长,字符的长度为50,浪费空间,存取速度快,数据不足时,会往右填充空格来满足长度。
varchar(50): 变长,字符的长度为50,节省空间,存取速度慢,存储数据的真实内容,不会填充空格,且会在真实数据前加1-2bytes,表示真实数据的bytes字节数。
简述触发器、函数、视图、存储过程?
触发器和存储过程都是一组mysql语句集
使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询。
触发器无法由用户直接调用,而知对表的【增/删/改】操作被动引发的。

存储过程存放于MySQL中,通过主动调用它的名字可以执行其内部的一堆sql
10. 主键和外键的区别? 
1.主键是能确定一条记录的唯一标识
2.外键用于与另一张表的关联,是能确定另一张表记录的字段,用于保持数据的一致性
4 drop, delete truncate的区别(美 /trʌŋ'ket/)
三者都是删除的意思,但是三者个有些区别
• delete和truncate只删除表的数据不删除表的结构
• 速度 drop > truncate > delete
• 想删除部分数据时, delete 删除时要带上where语句
• 保留表而想删除所有的数据时用truncate
视图(view)的作用,可以更改吗?
视图是虚拟的表;只包含动态检索数据的查询,不包含数据;简化操作,隐藏细节,保护数据;对视图的更新会作用于基表,一般不更新;
concat, group_concat函数的作用是什么?
concat() 用于连接字符串,
将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
索引的本质是什么?索引有什么优点,缺点是什么?
索引是帮助MySQL高效获取数据的数据结构。因此,索引的本质是一种数据结构。
在数据之外,数据库系统还可以维护满足特定查找算法的数据结构,这些数据结构以某种方式指向真实数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

优点:
1、提高数据检索效率,降低数据库的IO成本;
2、通过索引对数据进行排序,降低了数据排序的成本,降低了CPU的利用率;

缺点:
1、索引实际上也是一张表,索引会占用一定的存储空间;
2、更新数据表的数据时,需要同时维护索引表,因此,会降低insert、update、delete的速度;

from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# 为什么建池 :我们必须对服务器开启的进程数或者线程数加以控制,让机器在一个自己可以承受的范围内运行
# 这就是进程池或线程池的作用
import os,time,random
from threading import currentThread
def task(name):
    print(f"{name} 线程:{currentThread().getName()}  pid:{os.getpid()} run")
    time.sleep(random.randint(1,3))
if __name__ == '__main__':
    pool = ThreadPoolExecutor(4) # 4个线程池的容量设定,
    for i in range(10):
        pool.submit(task,'alex %s'%i)
    pool.shutdown(wait=True)#等待池内所有任务执行完毕回收完资源后才继续
print('')
原文地址:https://www.cnblogs.com/foremostxl/p/9814864.html