resume( )方法恢复哪些线程的执行?
A.通过调用stop( )方法而停止的线程
B.通过调用sleep( )方法而停止运行的线程
C.通过调用wait( )方法而停止运行的线程
D.通过调用suspend( )方法而停止运行的线程
在以下( ),线程就进入可运行状态。
A.线程调用了sleel()方法时
B.线程调用了join()方法时
C.线程调用了yield()方法时
D.以上都是
下列关于线程的说法中,正确的是
A.一个线程一旦被创建,就立即开始运行
B.使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行
C.当运行状态的线程因为调用了yield()方法而停止运行,它一定被放在可运行线程队列的前面
D.当因等待对象锁而被阻塞的线程获得锁后,将直接进入运行状态
创建一个线程之后,通过调用该线程对象的______方法将潜入该线程的虚拟CPU置于可运行状态。
A.一个异常被抛出
B.线程执行了sleep()调用
C.高优先级的线程处于可运行状态
D.当前线程产生了一个新线程
广州市品高软件股份有限公司12月招聘面试题面试题面试官常问到的一些题目整理如下:问题 Q1:简单谈下GIL?可用的回答 : Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制, Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在任意时刻,只有一个线程在解释器中运行。 对Python 虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。 在多线程环境中,Python 虚拟机按以下方式执行: 1. 设置GIL 2. 切换到一个线程去运行 3. 运行: a. 指定数量的字节码指令,或者 b. 线程主动让出控制(可以调用time.sleep(0)) 4. 把线程设置为睡眠状态 5. 解锁GIL 6. 再次重复以上所有步骤 在调用外部代码(如C/C+扩展函数)的时候,GIL 将会被锁定, 直到这个函数结束为止(由于在这期间没有Python 的字节码被运行,所以不会做线程切换)。 问题 Q2:scrapy和requests的使用情况?可用的回答 : requests 是 polling 方式的,会被网络阻塞,不适合爬取大量数据 scapy 底层是异步框架 twisted ,并发是最大优势 问题 Q3:简述 三次握手、四次挥手的流程?可用的回答 : 三次握手: 初始状态:客户端A和服务器B均处于CLOSED状态,然后服务器B创建socket,调用监听接口使得服务器处于LISTEN状态,等待客户端连接。(后续内容用A,B简称代替) 1、A首先向B发起连接,这时TCP头部中的SYN标识位值为1,然后选定一个初始序号seq=x(一般是随机的), 消息发送后,A进入SYN_SENT状态,SYN=1的报文段不能携带数据,但要消耗一个序号。 2、B收到A的连接请求后,同意建立连接,向A发送确认数据,这时TCP头部中的SYN和ACK标识位值均为1,确认序号为ack=x+1, 然后选定自己的初始序号seq=y(一般是随机的),确认消息发送后, B进 入SYN_RCVD状态,与连接消息一样,这条消息也不能携带数据,同时消耗一个序号。 3、A收到B的确认消息后,需要给B回复确认数据,这时TCP头部中的ACK标识位值为1, 确认序号是ack=y+1,自己的序号在连接请求的序号上加1,也就是seq=x+1, 此时A进入ESTABLISHED状态,当B收到A的确认回复后,B也进入ESTABLISHED状态, 至此TCP成功建立连接,A和B之间就可以通过这个连接互相发送数据了。 四次挥手: 初始状态:客户端A和服务器B之间已经建立了TCP连接,并且数据发送完成,打算断开连接, 此时客户端A和服务器B是等价的,双方都可以发送断开请求,下面以客户端A主动发起断开请求为例。(后续内 容用A,B简称代替) 1、A首先向B发送断开连接消息,这时TCP头部中的FIN标识位值为1,序号是seq=m,m为A前面正常发送数据最后一个字节序号加1得到的, 消息发送后A进入FNI_WAIT_1状态,FIN=1的报文段不能携带数据,但要消耗一个序号。 2、B收到A的断开连接请求需要发出确认消息,这时TCP头部中的ACK标识位值为1,确认号为 ack=m+1, 而自己的序号为seq=n,n为B前面正常发送数据最后一个字节序号加1得到的, 然后B进入 CLOSE_WAIT状态,此时就关闭了A到B的连接, A无法再给B发数据,但是B仍然可以给A发数据,同时B端通知上方应用层,处理完成后被动关闭连接。 然后A收到B的确认信息后,就进入了 FIN_WAIT_2状态。 3、B端应用层处理完数据后,通知关闭连接, B向A发送关闭连接的消息,这时TCP头部中的FIN和ACK标识位值均为1, 确认号ack=m+1,自己的序号为seq=k,消息发送后B进入LACK_ACK状态。 4、A收到B的断开连接的消息后,需要发送确认消息, 这是这时TCP头部中的ACK标识位值为1,确认号ack=k+1,序号为m+1(因为A向B发送断开连接的消息时消耗了一个消息号), 然后A进入TIME_WAIT 状态,若等待时间经过2MSL后,没有收到B的重传请求, 则表明B收到了自己的确认,A进入CLOSED状态, B收到A的确认消息后则直接进入CLOSED状态。至此TCP成功断开连接。 问题 Q4:什么是正则的贪婪匹配?可用的回答 : 如: str=abcaxc; p=ab.*c; 贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。 如上面使用模式p匹配字符串 str,结果就是匹配到:abcaxc(ab.*c)。 非贪婪匹配:就是匹配到结果就好,就少的匹配字符。 如上面使用模式p匹配字符串str,结果就是匹配 到:abc(ab.*c) 问题 Q5:如何在Python中实现多线程?可用的回答 :Python有一个多线程库,但是用多线程来加速代码的效果并不是那么的好,Python有一个名为Global Interpreter Lock(GIL)的结构。GIL确保每次只能执行一个“线程”。一个线程获取GIL执行相关操作,然后将GIL传递到下一个线程。虽然看起来程序被多线程并行执行,但它们实际上只是轮流使用相同的CPU核心。有这些GIL传递都增加了执行的开销。这意味着多线程并不能让程序运行的更快问题 Q6:单引号,双引号,三引号的区别?可用的回答 : 单引号和双引号是等效的,如果要换行,需要符号(),三引号则可以直接换行,并且可以包含注释 如果要表示Lets go 这个字符串 单引号:s4 = Lets go 双引号:s5 = “Lets go” s6 = I realy like“python”! 这就是单引号和双引号都可以表示字符串的原因了 问题 Q7:Python中的docstring是什么?可用的回答
A.定义线程A在较低的优先级运行。
B.定义线程B在更高的优先级运行。
C.执行WaitCallback委托来同步线程。
D.调用线程A睡眠的方法
E.调用线程A自旋锁的方法
A.在主程序中创建线程对象;
B.调用线程对象的start函数来启动线程;
C.在Windows中注册一个现成;
D.由Thread类派生出一个线程类;
在以下什么情况下,线程就进入可运行状态? ( )
A.线程调用了sleep()方法时
B.线程调用了join()方法时
C.线程调用了yield()方法时
D.以上都是
下列说法正确的是()。
A.线程的终止一般可通过两种方法来实现,自然撤销(线程执行完)或是被停止(调用stop()方法)
B.一个暂时终止运行的线程(例如,睡眠或阻塞)在排除了终止原因后直接运行
C.一个线程因为输入输出操作被阻塞时,执行resume()方法可以使其恢复就绪状态
D.调用了suspend()方法,也可以使线程进入死亡状态
resume()力法恢复哪些线程的执行
A.通过调用stop()方法而停止的线程
B.通过调用sleep()方法而停止运行的线程
C.通过调用wait()方法而停止运行的线程
D.通过调用suspend()方法而停止运行的线程