前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日一题:协程相关

每日一题:协程相关

作者头像
用户7685359
发布2020-08-24 16:20:46
4360
发布2020-08-24 16:20:46
举报
文章被收录于专栏:FluentStudy

点击关注了解更多精彩内容!!

上文介绍了协程的概念,相对应的这里提供几个关于协程的面试题目。

理论结合“面试”

理论题

1、什么是进程、线程、协程?

答案要点: a、进程是资源分配,每个进程拥有独立的资源空间,因为进程不共享资源,所以就涉及到进程间通信的方式,常见的方式有:消息队列、管道、信号量、socket套接字等。(这里会引申出几个面试题:进程间有通信方式有哪些?-> 使用过哪些消息队列?

b、线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。线程是在进程下,所以同一进程下的多个线程是能共享资源的。线程能共享的资源有:堆、全局变量、文件描述符和信号处理等,不共享的资源:栈、寄存器等(这里会引申出的面试题:多线程怎么实现?-> 多线程并发问题 -> 多线程共享哪些资源

c、协程是单线程下实现多任务,它通过 yield 关键字来实现,能有效地减少多线程之间切换的开销。它是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。

2、协程有什么优缺点? 答案要点 1、协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行),性能得到了很大的提升,不会像线程切换那样消耗资源。

2、缺点:异步代码,可能不那么容易理解和调度

编程题

1、下面代码输出结果是什么?

代码语言:javascript
复制
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):

代码语言:javascript
复制
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)

你点的每个赞,我都认真当成了喜欢

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FluentStudy 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 理论题
  • 编程题
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档