每日一题:协程相关
点击关注了解更多精彩内容!!
上文介绍了协程的概念,相对应的这里提供几个关于协程的面试题目。
理论结合“面试”
理论题
1、什么是进程、线程、协程?
答案要点: a、进程是资源分配,每个进程拥有独立的资源空间,因为进程不共享资源,所以就涉及到进程间通信的方式,常见的方式有:消息队列、管道、信号量、socket套接字等。(这里会引申出几个面试题:进程间有通信方式有哪些?-> 使用过哪些消息队列?)
b、线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。线程是在进程下,所以同一进程下的多个线程是能共享资源的。线程能共享的资源有:堆、全局变量、文件描述符和信号处理等,不共享的资源:栈、寄存器等(这里会引申出的面试题:多线程怎么实现?-> 多线程并发问题 -> 多线程共享哪些资源)
c、协程是单线程下实现多任务,它通过 yield 关键字来实现,能有效地减少多线程之间切换的开销。它是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。
2、协程有什么优缺点? 答案要点 1、协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行),性能得到了很大的提升,不会像线程切换那样消耗资源。
2、缺点:异步代码,可能不那么容易理解和调度
编程题
1、下面代码输出结果是什么?
def test():
print("1"*30)
yield "A"
print("A"*30)
yield "B"
print("B"*30)
t = test() # 1
print(next(t)) # 2
print(next(t)) # 3
print(next(t)) # 4
答案要点: 这其实是属于生成器的一个题目,输出如下: 1:没有任何输出,它不会执行 print("1"*30),只会返回一个生成器 2:输出 "111…111"(30个),同时打印返回值"A" 3:输出 "111…111"(30个),同时打印返回值"B" 4:异常、StopIteration
2、请写一个简单的协程示例 或 利用协程实现一个 生产者消费者 模式
面试一般其实比较少说让面试者手写一个协程代码,不过之前确实有遇到过让手写一个利用协程实现生产者消费者模式的。示例代码如下(代码来源于:https://www.liaoxuefeng.com/wiki/897692888725344/923057403198272):
import time
def consumer():
r = ''
while True:
n = yield r
if not n:
return
print('[CONSUMER] Consuming %s...' % n)
time.sleep(1)
r = '200 OK'
def produce(c):
c.next()
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n)
print('[PRODUCER] Consumer return: %s' % r)
# 终止协程
# 终止协程的方式:generator.throw 或者 generator.close
c.close()
if __name__=='__main__':
c = consumer()
produce(c)
你点的每个赞,我都认真当成了喜欢
- 【自然框架】n级下拉列表框的原理
- 【自然框架】分享 n级联动下拉列表框
- GSM Hacking Part ②:使用SDR捕获GSM网络数据并解密
- 【自然框架】之数据访问 —— 再小的类库也需要设计。
- 【自然框架】之表单控件(一)实体类(Class)VS 字典(Dictionary)
- 跨平台后门Mokes现已加入OS X豪华午餐
- 【问底】严澜:数据挖掘入门——分词
- 机器学习-简单线性回归教程
- NSA(美国国安局)泄漏Exploit分析
- 详解Windows Shim的攻防利用
- 基于Github的源码白盒扫描工具Raptor
- 把业务逻辑变成数据结构和SQL语句的例子。自然架构改成自然框架
- 【自然框架】之通用权限(六):权限到节点
- 【自然框架】之“元数据”的威力
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法