转发:大厂5G python自动化测试面试必会 | 多线程
Posted COCOgsta
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转发:大厂5G python自动化测试面试必会 | 多线程相关的知识,希望对你有一定的参考价值。
1、使用多线程以及类似Queue的共享数据结构的时候可以规划成几个执行特定函数的线程?
参考:《Python核心编程》(第3版)
答:
UserRequestThread
RequestProcessor
ReplyThread
2、接问题1,每个线程有什么作用?
参考:《Python核心编程》(第3版)
答:
UserRequestThread:负责读取客户端输入,该输入可能来自 I/O 通道。程序将创建多个线程,每个客户端一个,客户端的请求将会被放入队列中。
RequestProcessor:该线程负责从队列中获取请求并进行处理,为第3个线程提供输出。
ReplyThread:负责向用户输出,将结果传回给用户(如果是网络应用),或者把数据写到本地文件系统或数据库中。
3、在多线程环境中,Python代码的执行原理是什么?
参考:《Python核心编程》(第3版)
答:
Python代码的执行是由Python虚拟机(又名解释器主循环)进行控制的。Python在设计时是这样考虑的,在主循环中同时只能有一个控制线程在执行,就像单核 CPU系统中的多进程一样。内存中可以有许多程序,但是在任意给定时刻只能有一个程序在运行。同理,尽管 Python 解释器中可以运行多个线程,但是在任意给定时刻只有一个线程会被解释器执行。
4、接问题3,Python虚拟机按照哪种方式执行?
参考:《Python核心编程》(第3版)
答:
对Python虚拟机的访问是由全局解释器锁(GIL)控制的。这个锁就是用来保证同时只能有一个线程运行的。在多线程环境中,Python虚拟机将按照下面所述的方式执行。
1.设置GIL。
2.切换进一个线程去运行。
3.执行下面操作之一。
a.指定数量的字节码指令。
b.线程主动让出控制权(可以调用time.sleep(0)来完成)。
4.把线程设置回睡眠状态(切换出线程)。
5.解锁GIL。
6.重复上述步骤。
5、Python提供了哪些模块用来支持多线程编程?
参考:《Python核心编程》(第3版)
答:
Python提供了thread、threading和Queue模块等;
程序是可以使用thread和threading模块来创建与管理线程。thread模块提供了基本的线程和锁定支持;而threading模块提供了更高级别、功能更全面的线程管理。使用Queue模块,用户可以创建一个队列数据结构,用于在多线程之间进行共享。我们将分别来查看这几个模块,并给出几个例子和中等规模的应用。
6、请简述thread与threading模块的使用选择以及使用场景。
参考:《Python核心编程》(第3版)
答:
推荐使用更高级别的threading模块,而不使用thread模块;
threading模块更加先进,有更好的线程支持,并且thread模块中的一些属性会和threading模块有冲突。另一个原因是低级别的 thread 模块拥有的同步原语很少(实际上只有一个),而threading模块则有很多。避免使用 thread 模块的另一个原因是它对于进程何时退出没有控制。当主线程结束时,所有其他线程也都强制结束,不会发出警告或者进行适当的清理。如前所述,至少threading模块能确保重要的子线程在进程退出前结束。
我们只建议那些想访问线程的更底层级别的专家使用thread模块。为了强调这一点,在Python3中该模块被重命名为_thread。你创建的任何多线程应用都应该使用threading模块或其他更高级别的模块。
7、thread模块提供了哪些常用的线程函数以及LockType锁对象的方法?
参考:《Python核心编程》(第3版)
答:
8、 简述threading模块提供了哪些类与可用的对象。
参考:《Python核心编程》(第3版)
答:
9、 threading模块是如何避免thread模块所产生的“当主线程退出时,所有子线程都将终止,不管它们是否仍在工作”的情况的?
参考:《Python核心编程》(第3版)
答:
threading 模块支持守护线程,其工作方式是:守护线程一般是一个等待客户端请求服务的服务器。如果没有客户端请求,守护线程就是空闲的。如果把一个线程设置为守护线程,就表示这个线程是不重要的,进程退出时不需要等待这个线程执行完成。服务器线程远行在一个无限循环里,并且在正常情况下不会退出。
10、threading模块是如何将一个线程设置为守护线程的?
参考:《Python核心编程》(第3版)
答:
要将一个线程设置为守护线程,需要在启动线程之前执行如下赋值语句:thread.daemon = True(调用thread.setDaemon(True)的旧方法已经弃用了)。同样,要检查线程的守护状态,也只需要检查这个值即可(对比过去调用 thread.isDaemon()的方法)。一个新的子线程会继承父线程的守护标记。整个Python程序(可以解读为:主线程)将在所有非守护线程退出之后才退出,换句话说,就是没有剩下存活的非守护线程时。
11、threading模块中的thread类主要包含了哪些属性和方法?
参考:《Python核心编程》(第3版)
答:
12、使用Thread类,可以有哪些方法来创建线程?
参考:《Python核心编程》(第3版)
答:
创建Thread的实例,传给它一个函数。
创建Thread的实例,传给它一个可调用的类实例。
派生Thread的子类,并创建子类的实例。
13、锁有哪几种状态?他们的行为有哪些?
参考:《Python核心编程》(第3版)
答:
锁有两种状态:锁定和未锁定。而且它也只支持两个函数:获得锁和释放锁。
当多线程争夺锁时,允许第一个获得锁的线程进入临界区,并执行代码。所有之后到达的线程将被阻塞,直到第一个线程执行结束,退出临界区,并释放锁。此时,其他等待的线程可以获得锁并进入临界区。不过请记住,那些被阻塞的线程是没有顺序的(即不是先到先执行),胜出线程的选择是不确定的,而且还会根据Python实现的不同而有所区别。
14、Queue/queue模块常用的属性都有哪些?
参考:《Python核心编程》(第3版)
答:
15、除了thread、threading以及Queue模块,与线程相关的标准库模块还有哪些?
参考:《Python核心编程》(第3版)
答:
————————————————
版权声明:本文为CSDN博主「yulanxuan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41701820/article/details/121425403
以上是关于转发:大厂5G python自动化测试面试必会 | 多线程的主要内容,如果未能解决你的问题,请参考以下文章
转载:大厂5G python自动化测试面试必会 | 对象与面向对象
转载:大厂5G python自动化测试面试必会 | 对象与面向对象
转载:大厂5G python自动化测试面试必会 | 迭代器与解析篇
转载:大厂5G python自动化测试面试必会 | 网络编程篇
转载:大厂5G python自动化测试面试必会 | 匿名函数lambda & 递归函数 & 函数属性和注解 & 函数式编程工具