Python企业面试题5 —— 网络编程和并发
1. 简述进程、线程和协程的区别以及应用场景?
# 进程:拥有自己独立的堆和栈,既不共享堆,也不共享栈,进程由操作系统调度。 # 线程:拥有自己独立的栈和共享的堆,线程也由操作系统调度。 # 协程和线程:协程避免了无意义的调度,由此可以提高性能;但同时协程失去了线程使用多CPU的能力。
进程与线程的区别:
- 地址空间:线程是进程内的一个执行单位,进程内至少有一个线程,他们共享进程的地址空间,而进程有自己独立的地址空间。
- 资源拥有:进程是资源分配和拥有的单位,同一个进程内线程共享进程的资源。
- 线程是处理器调度的基本单位,但进程不是。
- 二者均可并发执行。
- 每个独立的线程有一个程序运行的入口。
协程与线程:
- 一个线程可以有多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。
- 线程进程都是同步机制,而协程是异步机制。
- 协程能保留上一次调用时的状态。
2. GIL锁是什么?
GIL锁本质就是一把互斥锁,所有的互斥锁本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务修改,进而保证数据的安全。GIL锁保护的是解释器级的数据,保护用户自己的数据则需要自己加锁处理。
应用(总结): 多线程用于IO密集型,如socket,爬虫,web 多进程用于计算密集型,如金融分析 1. 每个cpython进程内都有一个GIL。 2. GIL导致同一进程内多个进程同一时间只能有一个运行。 3. 之所以有GIL,是因为cpython的内存管理不是线程安全的。 4. 对于计算密集型用多进程,多IO密集型用多线程。
3. python如何使用线程池?
线程池:
from concurrent.futures import ThreadPoolExecutor import time def run(i): print('%s 开始' % i) time.sleep(2) print('%s 结束' % i) start_time = time.time() print(start_time) # 创建线程池的三种方式 pool = ThreadPoolExecutor(3) # 指定最大任务数 # 方式一 把所有任务放入线程池 for i in range(12): pool.submit(run, i) # 方式二 列表推导式 # tasks = [pool.submit(run, i) for i in range(12)] # 方式三 使用 map # pool.map(run, range(9)) # 阻塞等待 pool.shutdown() print(time.time()-start_time)
4. 什么是并发和并行?
- 并发:同一时刻只能处理一个任务,但一个时间段内可以对多个任务进行交替处理(一个处理器同时处理多个任务)
- 并行:同一时刻可以处理多个任务(多个处理器或者是多核的处理器同时处理多个不同的任务)
类比:并发是一个人同时吃三个馒头,而并行是三个人同时吃三个馒头。
5. 线程锁的作用?
当有多个线程,且它们同时访问同一资源时,需要考虑如何避免线程冲突。解决办法是使用线程锁。锁由Python的threading模块提供,并且它最多被一个线程所持有。当一个线程试图获取一个已经锁在资源上的锁时,该线程通常会暂停运行,直到这个锁被释放。
6. 什么是异步非阻塞?
非阻塞:不等待,不需要进程等待下去,继续执行其他操作,不管其他进程的状态。
即遇到IO阻塞不等待(setblooking=False),(可能会报错->捕捉异常) - sk=socket.socket() - sk.setblooking(False)
异步:回调,当达到某个指定的状态之后,自动调用特定函数
异步体现在回调上,回调就是有消息返回时告知一声,进程进行处理。
7. 路由器和交换机的区别?
1. 交换机:负责内网里的数据传递(arp协议)根据MAC地址寻址 路由器:在网络层,路由器根据路由表寻找该IP的网段 2. 路由器:可以处理TCP/IP协议 3. 交换机:可以把很多主机连起来,这些主机对外各有各的IP 路由器:可以把一个IP分配给很多主机使用,这些主机对外只表现出一个IP。 4. 交换机:是做端口扩展的,也就是让局域网可以连进来更多的电脑。 路由器:是用来做网络连接的,也就是连接不同的网络。
8. 什么是域名解析?
在互联网上,所有的地址都是IP地址,现阶段主要是IPv4(比如:110.110.110.110)。但是这些IP地址太难记了,所以就出现了域名(比如 http://baidu.com )。域名解析就是将域名转换为IP地址的这样一种行为。
9. 什么是CDN?
CDN即内容分发网络,目的是使用户可以就近到服务器取得所需内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。
10. LVS是什么及其作用?
LVS:Linux虚拟服务器
作用:主要用于多服务器的负载均衡。
它工作在网络层,可以实现高性能,高可用的服务器集群技术。
它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。
它易用,配置非常简单,且有多种负载均衡的方法。
它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。
另外可扩展性也非常好。
11. 什么是负载均衡?
多在高并发情况下需要使用。其原理就是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,多台服务器(集群)共同完成工作任务,从而提高了数据的吞吐量。
12. Nginx是什么及其作用?
Nginx是一个轻量级、高性能、稳定性高、并发性好的HTTP和反向代理服务器。也是由于其的特性,其应用非常广。
作用:
- 反向代理:是用来代理服务器的,代理我们要访问的目标服务器。代理服务器接受请求,然后将请求转发给内部网络的服务器(集群化),并将从服务器上得到的结果返回给客户端,此时代理服务器对外就表现为一个服务器。
Nginx在反向代理上,提供灵活的功能,可以根据不同的正则采用不同的转发策略。 - 负载均衡:Nginx可使用的负载均衡策略有:轮询(默认)、权重、ip_hash、url_hash(第三方)、fair(第三方)
- 动静分离:
Nginx提供的动静分离是指把动态请求和静态请求分离开,合适的服务器处理相应的请求,使整个服务器系统的性能、效率更高。Nginx可以根据配置对不同的请求做不同转发,这是动态分离的基础。静态请求对应的静态资源可以直接放在Nginx上做缓冲,更好的做法是放在相应的缓冲服务器上。动态请求由相应的后端服务器处理。
本文来自博客园,作者:生而自由爱而无畏,转载请注明原文链接:https://www.cnblogs.com/zczhaod/p/18149693
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!