python网编并发数据库

第一部分 必答题

  1. 简述 OSI 7层模型及其作用?(2分)

    应用层:与用户直接交互,软件、网站等

    表示层:使用软件、网站可以查看的数据,图片等

    会话层:保持登录状态,电脑中为cookie

    传输层:选择TCP/UDP协议,进行数据发送。

    网络层:通过IP路径寻址,并且对数据进行封装

    数据链路层:使用mac地址寻址,又进行了数据封装

    物理层:将上面得到的数据转化为信号

  2. 简述 TCP三次握手、四次回收的流程。(3分)

    三次握手:

    • 第一次握手:Client将标志设置为SYN=1,随机产生一个seq=J,并将该数据包发送给server,client进入SYN_SENT状态,等待server确认。
    • 第二次握手:server收到数据包后由标志位SYN=1知道client请求建立链接,server将标志位SYN和ACK都设置为1,ack=J+1,随机产生一个值seq=K,并将数据包发送给client确认连接,server进入syn_rcvd状态。
    • 第三次握手:client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK设置为1,ack=K+1,并将该数据包发送给server,server检查ack是否为K+1,ACK是否为1,如果正确则建立链接,client和server进入ESTABALISED状态,完成三次握手。

    四次挥手:

    • 第一次挥手:客户端发送FIN到服务端请求断开链接。
    • 第二次挥手:服务端收到这个FIN,发回一个ACK,确认序号为收到的序号+1,和SYN一样,FIN占用一个序号。
    • 第三次挥手:服务器发送一个FIN给客户端,此时可以断开客户端链接,
    • 第四次挥手:客户端收到FIN报文,会向服务端发送ACK确认,经过两个msl时长,断开链接。
  3. TCP和UDP的区别?(3分)

    TCP是可靠的,面向链接,速度慢,适用于上传、下载、发邮件,传递数据长度不受限制,流式传输,全双工。

    UDP是不可靠的,面向数据报,速断快,适用于即时通讯 ,传递数据长度受限制,不占用链接。

  4. 什么是黏包?(2分)

    当多条消息发送时,接收变成了一条或出现数据接收不准的清况。

  5. 什么 B/S 和 C/S 架构?(2分)

    B/S:浏览器和服务端交互

    C/S:客户端和服务端交互

  6. 请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)
    # 服务端:import socket?sk = socket.socket()sk.bind((‘0.0.0.0‘,9899))sk.listen()?conn,addr = sk.accept()conn.send(‘我是客户端001‘).encode(‘utf-8‘)msg = conn.recv(1024).decode(‘utf-8‘)print(msg)conn.close()sk.close()??# 客户端import socket?sk = socket.socket()sk.connent("127.0.0.1",9899)msg = sk.recv(1024).decode(‘utf-8‘)print(msg)sk.send(‘我是客户端002‘.encode(‘utf-8‘))sk.close()
  7. 简述进程、线程、协程的区别?(3分)
    • 区别: 进程是计算机资源分配的最小单位。 线程时是计算机中CPU调度的最小单位。 协程又称为‘微线程’,是基于代码,人为创造的,而进程、线程时计算机中真实存在的,一个进程中可以有多个线程,一个线程可以创建多个协程。 计算密集型:用多进程 IO密集型:用多线程/协程+IO切换线程是CPU调度的最小单位
  8. 什么是GIL锁?(2分)

    GIL是全局解释器锁,本质就是一把互斥锁,同一时刻保证每一个进程中只有一个线程可以被cpu调度,所以在python开发时要注意:计算密集型,用多进程;IO密集型,用多线程

  9. 进程之间如何进行通信?(2分)

    IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。

  10. Python如何使用线程池、进程池?(2分)
    通过ProcessPoolExecutor模块,限制程序中可创建线程&进程的个数,防止无节制创建线程&进程,导致性能降低
  11. 请通过yield关键字实现一个协程? (2分)
    ?
  12. 什么是异步非阻塞? (2分)

    一个程序执行中调用了另一个程序,不等待这个任务完毕,就继续执行下一个程序。

  13. 什么是死锁?如何避免?(2分)
    • 死锁:lock互斥锁两次、多个锁交叉使用会导致死锁。
    • 避免:避免互斥锁两次,避免多个锁交叉使用。
  14. 程序从flag a执行到falg b的时间大致是多少秒?(2分)
    import threadingimport timedef _wait():    time.sleep(60)# flag at = threading.Thread(target=_wait)t.setDeamon(False)t.start()# flag b?#   不到1秒
  15. 程序从flag a执行到falg b的时间大致是多少秒?(2分)
    import threadingimport timedef _wait():    time.sleep(60)# flag at = threading.Thread(target=_wait)t.setDeamon(True)t.start()# flag b?# 不到1秒
  16. 程序从flag a执行到falg b的时间大致是多少秒?(2分)
    import threadingimport timedef _wait():    time.sleep(60)# flag at = threading.Thread(target=_wait)t.start()t.join()# flag b?# 60秒
  17. 读程序,请确认执行到最后number是否一定为0(2分)
    import threadingloop = int(1E7)def _add(loop:int = 1):    global number    for _ in range(loop):        number += 1def _sub(loop:int = 1):    global number    for _ in range(loop):        number -= 1number = 0ta = threading.Thread(target=_add,args=(loop,))ts = threading.Thread(target=_sub,args=(loop,))ta.start()ta.join()ts.start()ts.join()?# 一定为0
  18. 读程序,请确认执行到最后number是否一定为0(2分)
    import threadingloop = int(1E7)def _add(loop:int = 1):    global number    for _ in range(loop):        number += 1def _sub(loop:int = 1):    global number    for _ in range(loop):        number -= 1number = 0ta = threading.Thread(target=_add,args=(loop,))ts = threading.Thread(target=_sub,args=(loop,))ta.start()ts.start()ta.join()ts.join()?# 不一定为0
  19. MySQL常见数据库引擎及区别?(3分)
  20. 简述事务及其特性? (3分)
  21. 事务的隔离级别?(2分)
  22. char和varchar的区别?(2分)
    • char 定长:节省时间,浪费空间 (255个字符)
    • varchar 变长:节省空间,浪费时间 (65535个字符)
  23. mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)
    • char 定长:节省时间,浪费空间 (255个字符)
    • varchar 变长:节省空间,浪费时间 (65535个字符)

    varchar(50):长度为50的字符串

  24. MySQL中delete和truncate的区别?(2分)

    delete只是删除数据

    truncate删除数据和缓存

  25. where子句中有a,b,c三个查询条件, 创建一个组合索引abc(a,b,c),以下哪种会命中索引(3分)
    (a)(b)(c)(a,b)(b,c)(a,c)(a,b,c)# (a),(a,b),(a,c),(a,b,c)
  26. 组合索引遵循什么原则才能命中索引?(2分)

    最左前缀

  27. 列举MySQL常见的函数? (3分)
    concat()    # 拼接group_concat()  # 打印分组下字段全部信息regexp      # 正则匹配abs()       # 返回绝对值avg()       # 平均值max()       # 最大值min()       # 最小值sum()       # 求和insert()    # 插入
  28. MySQL数据库 导入、导出命令有哪些? (2分)
    导出整个数据库(包括数据库中的数据):mysqldump -u username -ppassword dbname > dbname.sql导出数据库中的数据表(包括数据表中的数据):mysqldump -u username -ppassword dbname tablename > tablename.sql导出数据库结构(不包括数据,只有创建数据表语句):mysqldump -u username -ppassword -d dbname > dbname.sql导出数据库中数据表的表结构(不包括数据,只有创建数据表语句):mysqldump -u username -ppassword -d dbname tablename > tablename.sql
  29. 什么是SQL注入?(2分)

    SQL注入是一种注入攻击,可以执行恶意SQL语句。

  30. 简述left join和inner join的区别?(2分)
    • left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
    • inner join(等值连接) 只返回两个表中联结字段相等的行
  31. SQL语句中having的作用?(2分)

    过滤

  32. MySQL数据库中varchar和text最多能存储多少个字符?(2分)

    varchar:最多65535个字符

    text:最多65535个字符

  33. MySQL的索引方式有几种?(3分)
    单列功能   普通索引:加速查找   唯一索引:加速查找 + 约束:不能重复(只能有一个空,不然就重复了)   主键(primay key):加速查找 + 约束:不能重复 +  不能为空多列  联合索引(多个列创建索引)-----> 相当于单列的普通索引  联合唯一索引            -----> 相当于单列的唯一索引
  34. 什么时候索引会失效?(有索引但无法命中索引)(3分)
    • 条件中有or
    • 多列索引
    • like查询以%开头
  35. 数据库优化方案?(3分)
    ?
  36. 什么是MySQL慢日志?(2分)
  37. 设计表,关系如下: 教师, 班级, 学生, 科室。(4分) 科室与教师为一对多关系, 教师与班级为多对多关系, 班级与学生为一对多关系, 科室中需体现层级关系。
    1.  写出各张表的逻辑字段2.  根据上述关系表    a.查询教师id=1的学生数    b.查询科室id=3的下级部门数    c.查询所带学生最多的教师的id
    ?
  38. 有staff表,字段为主键Sid,姓名Sname,性别Sex(值为"男"或"女"),课程表Course,字段为主键Cid,课程名称Cname,关系表SC_Relation,字段为Student表主键Sid和Course表主键Cid,组成联合主键,请用SQL查询语句写出查询所有选"计算机"课程的男士的姓名。(3分)
  39. 根据表关系写SQL语句(10分)
    • 查询所有同学的学号、姓名、选课数、总成绩;
    • 查询姓“李”的老师的个数;
    • 查询平均成绩大于60分的同学的学号和平均成绩;
    • 查询有课程成绩小于60分的同学的学号、姓名
    • 删除学习“叶平”老师课的score表记录;
    • 查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
    • 查询每门课程被选修的学生数;
    • 查询出只选修了一门课程的全部学生的学号和姓名;
    • 查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
    • 查询两门以上不及格课程的同学的学号及其平均成绩;

第二部分 补充题

    1. 什么是IO多路复用?

      网络数据传输监控机制 - 多个网络连接复用一个监听机制

      select模块\selectors模块

      操作系统提供的io多路复用的机制 select poll epoll

      epoll最好 用的是回调函数的机制

      select poll 的内部机制 是 轮询

    2. async/await关键字的作用?

      async用来定义一个协程函数的

      await用来控制一个可能发生io阻塞的任务的切入和切出

      async def func():pass
      
      ?	await asyncio.sleep(2)
      
      import asyncio
      
      loop = asyncio.get_event_loop()
      
      loop.run_until_complete(func)
      
    3. MySQL的执行计划的作用?

      不执行sql,在之前先查看以下sql的顺序 索引的使用情况 从而去推测 优化sql语句

    4.简述MySQL触发器、函数、视图、存储过程?

    触发器 trigger:在用户对某张表做完某个固定的操作(insert update delete) 会自动在数据库中触发另一个动作

    insert 一条数据 苹果手机

    往对应的统计表中 把苹果这条数据 +1

    函数(function):根据参数进行判断 循环 得出一个结果 并返回,通过select 函数名(参数)来调用并查看结果

    视图(view) : 帮助我简化查询部分的连表操作

    存储过程(procedure): 可以实现非常负责的sql逻辑 并对数据进行增删改查 且可以返回多个结果 call 名字(参数)调用

    5.数据库中有表:t_tade_date

    id		tade_date
    1		2018-1-2
    2		2018-1-26
    3		2018-2-8
    4		2018-5-6
    ...
    输出每个月最后一天的ID

原文地址:https://www.cnblogs.com/Penicillin/p/12371369.html

时间: 2024-11-06 23:03:25

python网编并发数据库的相关文章

python面试题 -- 网编并发

Python面试重点(进阶篇) 注意:只有必答题部分计算分值,补充题不计算分值. 第一部分 必答题 简述 OSI 7层模型及其作用?(2分) # 应用层:文件传输,文件管理,电子邮件的信息处理# 表示层:确保一个系统的应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据解析,管理数据的解密和加密# 会话层:验证访问和会话管理# 传输层:为应用程序之间提供端对端的逻辑通信.# 网络层:选择合适的网间路由完成两个计算机之间的多个数据链路,通过路由协议和地址解析协议(ARP).IP,RIP(路

网编并发

Python面试重点(进阶篇) 注意:只有必答题部分计算分值,补充题不计算分值. 第一部分 必答题 简述 OSI 7层模型及其作用?(2分) 物理层:定义物理设备的标准,主要对物理连接方式. 数据链路层:主要对物理层传输的比特六包装,检测保证数据传输的可靠性将物理层接受的数据进行max地址的封装和解封装. 网络层:控制子网的运行.路由的最小单位——分组(包) 传输层:定义一些传输数据的协议和端口 会话层:负责在网络中的两个节点建立,维持和终止信息.解决节点连接的协调和管理问题. 表示层:管理数据

Python网编_join方法

前言:我们知道父进程要负责回收子进程占用的系统资源(就是父要给子收尸)so父进程要等子进程结束之后收了尸才能结束,如果父进程先结束,子进程的资源就没法被回收,就会一直占用系统资源,就成了僵尸进程了我们的Python中如果父进程即使运行完了或者报错了也要等待子进程结束收了尸再结束 举个例子:我们要给500个人群发邮件 假设我们每发送一封邮件需要0.1s 总耗时0.1*500 = 50s 那么我们开启了10个进程,每个进程负责50个邮件 所有进程发送完邮件,我们需要得到一个通知:所有的进程都已经发送

Python网编_进程之间的数据隔离

写在前面: 控制台的本质是一个文件 文件操作的时候尽量不要用r+ w+ a+ 如果用要小心文件指针混乱 随着进程数量的增多会有一些隐患 from multiprocessing import Process n = 100 # 定义一个全局变量 def func(): global n # 通过global改变n的值 n -= 1 if __name__ == '__main__': lis = [] for i in range(2): # 开启两个进程 p = Process(target=

Python网编_进程对象的其他方法

直接上代码: from multiprocessing import Process import time class MyProcess(Process): def __init__(self,a,b): super().__init__() self.a = a self.b = b def run(self): print('start') time.sleep(0.1) print(self.a,self.b) if __name__ == '__main__': p = MyProc

Python网编_守护进程

假如我有500台机器,跑着500个进程,假如有一部分台机器挂了,我们怎么能及时的知道呢?我们维护自己的机器当然要及时的直到啦so 如果我们有一个监控的软件来实时的监控是不是就可以解决这个问题啦其原理是:client端每隔一个时间段(比如60秒)汇报给server端 没有在正确的时间收到某台机器的汇报就说明这台机器出问题了,应该去看一看.那么如何做呢?在client端的主进程中开启一个子进程,通过这个子进程来汇报,看下面: from multiprocessing import Process i

Python网编_进程间的数据共享

Manager提供了很多数据共享机制,但是对于一些基础数据类型来说,是数据不安全的,那么Q:如何解决呢? A: 需要我们自己手动加锁 from multiprocessing import Manager,Process,Lock # Process开子进程用,Lock数据加锁用,Manager进程间数据共享用 def work(d,lock): # lock.acquire() # d['count'] -= 1 # lock.release() with lock: # 上下问管理 注意了l

Python网编_进程池的回调函数

将n个任务交给n个进程去执行每一个进程在执行完毕之后会有一个返回值,这个返回值交给callback函数指定的那个函数去处理这样的话所有的进程哪一个执行的最后快,哪一个就可以先进性统计工作这样就能在最短的时间内得到我们想要的结果 import time import random from multiprocessing import Pool def get(i): # 使用i模拟网站地址 在子进程中执行 time.sleep(random.random()) # 模拟不同的网站返回数据的时间

用python脚本导出mysql数据库查询结果到Excel表

最近需要导数据的情况太多,总用跳板机上的navicat工具有点效率低,也觉得挺麻烦的(由于跳板机无法连通外网 所以导出数据文件还得通过sftp传到本机)anyway 还是写个脚本好了.之前写过一个shell脚本做的定时导出任务,现在试试用python写下 主要用到的库有: pymysql -- 连数据库的无需多说os & sys -- 可能回涉及到工作目录或者外部传参xlwt -- 写excel 下面就是代码了,总体还是挺简单的,主要遇到个字符编码的问题,改成utf-8就解决了还有个没解决掉的问