并发和数据库

Python面试重点(进阶篇)

注意:只有必答题部分计算分值,补充题不计算分值。

第一部分 必答题

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

    物理层 数据链路层 网络层 传输层 会话层 表示层 应用层

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

    建立连接

    由客户端发起一个syn请求,服务端接收并回复(ack syn)

    客户端收到ack和syn之后再回复一个ack确认

    在原生的socket代码中三次握手是由accept connect

    断开连接 客户端向服务端发起请求断开连接的请求 服务端向客户端确认请求 服务端向客户端发起断开连接请求 客户端向服务端确认断开请求

     

  3. TCP和UDP的区别?(3分)

    TCP协议 -可靠 面向连接 速度慢 传递长度无限 全双工 流式传输

    UDP协议 -不可靠 面向无连接 数据报 速度快传递数据长度有限 一对一 一对多 多对多

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

    当多条消息发送时接受变成了一条或者出现接受不准确的情况

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

    浏览器 服务端 只输入网址就可以使用

    客户端 服务端

  6. 请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)

    服务端 import socket sk = socket.socket() sk.bind(('127.0.0.1',8000)) sk.listen() conn,addr=sk.accept() mesg= conn.recv(1024).decode('utf-8') print(mesg) sonn.close() sk.close()

    客户端 import socket sk = socket.socket() sk.connect(('127.0.0.1',8000)) mesg= sk.send('hello world'.encode('utf-8'))sk.close()

  7. 简述进程、线程、协程的区别?(3分)

    都可以提高并发能力 进程计算机中分配资源的最小单位,线程cpu可调度的最小单位 实际上是让一个线程轮番去执行一些任务协程又可以称为 微线程,是基于代码认为创造出来的,进程和线程是计算机中真实存在的 一个线程中可以创建多个协程

  8. 什么是GIL锁?(2分)

    全局解释器锁

    同一时刻保证一个进程中只有一个线程可以被CPU调度

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

    IPC

  10. Python如何使用线程池、进程池?(2分)

    线程池

    from concurrent.futures import ThreadPoolExecutor
    import time
    def task(n1,n2):
       time.sleep(2)
       print('任务')
       return 666

    pool = ThreadPoolExecutor(10)

    num = int(input(">>>"))
    for i in range(num):
       pool.submit(task,i,1)  
    pool.shutdown(True)  
    print('end')

    ret = pool.map(task,range(1,20))
    print('end',ret)
    pool.shutdown(True)
    for item in ret:
    print(item)

    进程池

    from concurrent.futures import ProcessPoolExecutor
    import time
    def task(n1,n2):
       time.sleep(2)
       print('任务')
       return 666

    pool = ProcessPoolExecutor(10)  

    num = int(input(">>>"))
    for i in range(num):
       pool.submit(task,i,1)
  11. 请通过yield关键字实现一个协程? (2分)

  12. 什么是异步非阻塞? (2分)

    遇到阻塞不等待程序继续执行

  13. 什么是死锁?如何避免?(2分)

    当两个线程相互等待对方,就会发生死锁 避免多次锁定

    使用定时锁

    具有相同的加锁顺序 死锁检测

  14. 程序从flag a执行到falg b的时间大致是多少秒?(2分)

    import threading
    import time
    def _wait():
    time.sleep(60)
    # flag a
    t = threading.Thread(target=_wait)
    t.setDeamon(False)
    t.start()
    # flag b 60
  15. 程序从flag a执行到falg b的时间大致是多少秒?(2分)

    import threading
    import time
    def _wait():
    time.sleep(60)
    # flag a
    t = threading.Thread(target=_wait)
    t.setDeamon(True)
    t.start()
    # flag b  
    0
  16. 程序从flag a执行到falg b的时间大致是多少秒?(2分)

    import threading
    import time
    def _wait():
    time.sleep(60)
    # flag a
    t = threading.Thread(target=_wait)
    t.start()
    t.join()
    # flag b
    60
  17. 读程序,请确认执行到最后number是否一定为0(2分)

    import threading
    loop = int(1E7)
    def _add(loop:int = 1):
    global number
    for _ in range(loop):
    number += 1
    def _sub(loop:int = 1):
    global number
    for _ in range(loop):
    number -= 1
    number = 0
    ta = 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 threading
    loop = int(1E7)
    def _add(loop:int = 1):
    global number
    for _ in range(loop):
    number += 1
    def _sub(loop:int = 1):
    global number
    for _ in range(loop):
    number -= 1
    number = 0
    ta = 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分)

    事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性

    原子性,一致性,隔离性,持久性

  21. 事务的隔离级别?(2分)

    读未提交 读提交 重复读 串行

  22. char和varchar的区别?(2分)

    char是一种固定长度的类型 空间换时间

    varchar则是一种可变长度的类型 时间换空间

  23. mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)

    varchar最大长度50 char一个字符占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) 1
  26. 组合索引遵循什么原则才能命中索引?(2分)

    对创建索引的列筛选效率高

    区分度小 不适合创建索引

    查询范围大 慢 小快

    多个条件用and相连

  27. 列举MySQL常见的函数? (3分)

    concat()     拼接
    group_concat() 打印分组下字段全部信息
    regexp 正则匹配
    abs() 返回绝对值
    avg() 平均值
    max() 最大值
    min() 最小值
    sum() 求和
    insert() 插入

    MySQL数据库 导入、导出命令有哪些? (2分)

  28. 导出整个数据库: mysqldump -u username -p password 库名> dbname.sql ;

    连接 source sql文件

    导入

    mysql --default-character-set=utf8 -u root -p 名 <news.sql

  29. 什么是SQL注入?(2分)

    将sql代码添加到输入参数中,传递到sql服务器解析并执行

  30. 简述left join和inner join的区别?(2分)

    左连接 内连接

  31. SQL语句中having的作用?(2分)

    过滤出来符合条件的数据

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

    65535

  33. MySQL的索引方式有几种?(3分)

  34. 什么时候索引会失效?(有索引但无法命中索引)(3分)

  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,最高分,最低分;

    • 查询每门课程被选修的学生数;

    • 查询出只选修了一门课程的全部学生的学号和姓名;

    • 查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;

    • 查询两门以上不及格课程的同学的学号及其平均成绩;

上一篇:setsockopt与getsockopt


下一篇:day35 python socket 单线程的并发 io多路复用 协程 greenlet模块 gevent模块