Python企业面试题5 —— 网络编程和并发

随笔1周前发布
2 0 0
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上做缓冲,更好的做法是放在相应的缓冲服务器上。动态请求由相应的后端服务器处理。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...