转发:大厂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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值