面试基础篇---迭代器,yield, tcp, 等
1.谈谈python的装饰器,迭代器,yield?
迭代器在内存中通常是一次性遍历的,也就是说,一旦遍历完所有元素,它就会停止工作,不可再用。
惰性计算:生成器按需生成数据,即只有在请求时才计算下一项数据,这样可以节省内存。
- 迭代器 是实现了 iter() 和 next() 方法的对象,适用于需要反复遍历数据的场景。
- 生成器 是一种简便的创建迭代器的方法,使用 yield 按需生成数据。生成器的优势在于内存效率,特别适用于处理大数据集或惰性计算的场景。
2. 标准库线程安全的队列是哪一个?不安全的是哪一个?logging是线程安全的吗?
- 线程安全的队列:queue.Queue、queue.LifoQueue、queue.PriorityQueue 是线程安全的队列;collections.deque 是不线程安全的。
- logging 模块是线程安全的:logging 模块已经考虑到了多线程环境,因此默认情况下是线程安全的。如果需要提高性能,可以使用 QueueHandler 和 QueueListener 来优化日志记录。
3.python适合的场景有哪些?当遇到计算密集型任务怎么办?
3.python高并发解决方案?我希望听到twisted->tornado->gevent
Gevent
- gevent 是一个基于协程的 Python 库,主要用于实现并发编程,特别适用于 I/O 密集型应用。它通过绿色线程和事件循环的机制,能够高效地处理大量的并发 I/O 操作(如网络请求、文件操作等)。
特点:
- 协程:使用轻量级的绿色线程来代替操作系统线程,避免了线程切换的开销。
- 事件循环:基于事件循环机制,处理 I/O 时能够异步切换任务,提高并发处理效率。
- 猴子补丁:通过 monkey.patch_all() 替换标准库中的阻塞操作(如 socket、time.sleep 等),让它们变为非阻塞操作。
- 适用场景:适合处理大量并发的 I/O 密集型任务,如 Web 服务、网络爬虫、实时数据处理等。
使用场景:
- 高并发的 Web 服务,如 REST API 服务器。
- 网络爬虫,能够同时从多个网站抓取数据。
- 实时数据流处理,适合与异步消息队列等系统集成。
Gunicorn
- Gunicorn 是一个高效的 WSGI 服务器,广泛用于部署 Python Web 应用(特别是与框架如 Flask、Django、FastAPI 等配合使用)。它是一个多进程服务器,通常与 gevent 或 eventlet 这样的异步库结合使用,以支持高并发。
特点:
- 多进程模型:Gunicorn 默认使用多进程(即每个请求由一个独立的进程处理),每个进程可以独立运行。
- WSGI 兼容:Gunicorn 是一个 WSGI 服务器,适用于任何符合 WSGI 标准的 Python Web 应用(如 Flask、Django、FastAPI 等)。
- 并发模式:通过与异步库(如 gevent 或 eventlet)结合使用,能够实现协程式并发处理。
- 适用场景:适用于大规模部署 Web 应用,支持多种并发模型,包括多进程、异步 I/O 等。
常见用法:
- 使用多个进程来处理请求(通过 workers 参数设置工作进程数量)。
使用 gevent 或 eventlet 配合,启用异步 I/O 处理。 - 可以通过配置文件进行调优,支持多种部署方式。
4 .tcp/udp的区别?tcp粘包是怎么回事,如何处理?udp有粘包吗?
TCP (Transmission Control Protocol)
面向连接:TCP 是一种面向连接的协议,在数据传输前需要进行三次握手(handshaking)来建立连接。
可靠性:TCP 提供可靠的传输服务,确保数据包按顺序到达,不丢失,不重复,并且无差错。通过校验和、确认应答、重传等机制来保证数据的完整性。
流量控制:TCP 提供流量控制和拥塞控制,避免发送方超载接收方。
数据流:TCP 是面向字节流的,发送的数据不保留边界,接收方只能按顺序读取字节流。
UDP (User Datagram Protocol)
无连接:UDP 是一种无连接的协议,数据传输不需要建立连接,也没有握手过程。
不可靠:UDP 不保证数据的可靠到达,不提供数据重传、顺序控制或流量控制。因此,数据可能丢失、重复或乱序。
较小的开销:因为没有连接管理、确认应答和重传机制,UDP 的开销较小,适合实时应用(如视频通话、在线游戏等)。
数据包:UDP 是面向数据包的,每个数据包(称为数据报)有明确的边界。
总结
- TCP 提供可靠的连接和数据传输,但效率较低,适用于需要保证数据完整性和顺序的应用(如网页、文件传输)。
- UDP 提供快速的无连接数据传输,适用于对速度要求较高,但可以容忍部分数据丢失的应用(如视频流、DNS 查询等)。
粘包:由于 TCP 是面向字节流的协议,发送端发送的数据会被流式传输到接收端,接收端无法知道每个数据包的边界。结果可能会出现多个小数据包合并成一个大包,导致接收方无法准确区分不同的消息,这种现象叫做“粘包”。
1.2 解决粘包
定长包:每次发送固定长度的数据包,接收方知道每个数据包的长度,因此可以根据长度来拆分接收到的数据。缺点是每次都要定义固定长度,不灵活。
包头指定长度:每个数据包的头部可以存储数据包的长度信息。接收方通过读取包头的长度信息,知道当前消息的完整长度,从而正确地读取数据。
分隔符:可以在每个数据包之间添加特定的分隔符(例如换行符、空格等),接收方根据分隔符来分隔消息。缺点是分隔符可能会出现在实际数据中,导致消息拆分出错。
时间戳:给每个数据包加上时间戳,接收方根据时间戳来判断消息的边界,虽然这种方法不常见,但也可以解决部分问题。
1.3 UDP 不发生粘包
TCP 是面向字节流的,可能发生粘包和拆包问题。粘包是因为接收方无法准确区分消息的边界,可以通过定长包、包头指定长度、分隔符等方法来解决。
UDP 是面向数据包的,每个数据包独立传输,不会发生粘包问题。但在应用层,仍然需要通过某种协议来处理连续发送的数据包。
2.time_wait是什么情况?出现过多的close_wait可能是什么原因?
3.epoll,select的区别?边缘触发,水平触发区别?
三.存储 存储可能包含rdbms,nosql以及缓存等,我以mysql,redis举例
mysql相关
1.谈谈mysql字符集和排序规则?
2.varchar与char的区别是什么?大小限制?utf8字符集下varchar最多能存多少个字符
3.primary key和unique的区别?
4.外键有什么用,是否该用外键?外键一定需要索引吗?
5.myisam与innodb的区别?innodb的两阶段锁定协议是什么情况?
6.索引有什么用,大致原理是什么?设计索引有什么注意点?
redis相关
1.什么场景用redis,为什么mysql不适合?
2.谈谈redis的事务?用事务模拟原子+1操作?原子操作还有其它解决方案吗?
3.redis内存满了会怎么样?
四.安全 web安全相关
1.sql注入是怎么产生的,如何防止?
2.xss如何预防?htmlescape后能否避免xss?
3.csrf是什么?django是如何防范的?
密码技术
1.什么是分组加密?加密模式有哪些?ecb和cbc模式有什么区别?为什么需要iv向量?
2.简单说说https的过程?
3.对称加密与非对称加密区别?
3.如何生成共享秘钥? 如何防范中间人攻击?
五.杂
是否关注新技术啊?golang,rust是否了解?numpy,pandas是啥鸟? 是否紧跟时代潮流?逛不逛微博,刷不刷知乎?