自动驾驶开发入门(二)---浅谈Apollo Cyber RT中的协程

72 篇文章 1 订阅
8 篇文章 10 订阅
协程作为轻量级的并发机制,其优点在于低开销的切换和易于理解的同步代码。在Cyber RT中,协程用于处理IO,通过Scheduler实现异步唤醒,提高实时响应。协程解决了自动驾驶系统对实时性和任务优先级的需求,而非单纯追求高并发。在实际使用中,需要注意协程的非阻塞性质和异步IO的封装。
摘要由CSDN通过智能技术生成

以下这些是个人对于协程的总结。

先说一下协程的优点:

● 协程的最大的优势:协程切换开销远小于线程,进程切换。相比于线程,协程没有内核态的上下文切换,近乎可以无限并发。协程在用户态进程显式的调度,可以把异步操作转换为同步操作,也意味着不需要加锁,避免了加锁过程中不必要的开销。Golang为什么有这么强的并发能力,协程居功至伟。协程创建于用户空间,理论上可以创建的协程数量远大于线程。

● 引入协程库后,代码以顺序性书写,易于理解,而执行时则是异步调用,性能不减。

使用协程需要注意的地方:

● 使用协程并不简单,在处理IO时,需要对IO函数进行封装,使之支持异步唤醒机制。例如Cyber RT的Schduler框架和微信的libco。

● 同一个线程内的任何一个协程不能发生阻塞,否则将阻塞所有相关协程。线程则没有这个问题。也就是说不要在协程中执行耗时的操作。

下面贴一下Cyber RT用协程处理IO的时序图:

在图中蓝圈处,用户主线程通过RoutineFactory和Schduler注册了两个协程回调函数。 Transport层(线程)接收到数据后,通过回调将数据填充到相关缓存中,并进行融合。然后通过Schduler唤醒之前注册的两个协程(图中红圈),并进行后续处理。协程是在Schduler框架中的Processor线程里执行。注意文中提到的三个线程。

需要说明的是,协程主要解决两个问题,高并发和应用层调度(优先级)。自动驾驶不同于WEB系统,并发量并不是特别大,这方面能带来的性能提升并不显著。自动驾驶对实时性要求较高,而使用得最多的操作系统是Linux,但它并不是一个实时操作系统,操作系统API提供的保证实时性的手段有限,改造操作系统也不现实。通过引入协程,可以更方便地对任务建立优先级,提高实时响应。Cyber RT引入协程的主要目的并不是为了提高并发量,而是为了实现用户空间的调度策略,设置任务优先级和CPU亲和性,以提高实时性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值