这一节开始介绍ProcessServer.idle_commands,前面我们知道ProcessServer.main就是不停调用idle_commands()以获取可用的套接字描述符或者是文件描述符来进行处理。

    def idle_commands(self, delay, fds=None):nextsleep = delay                                                              #设置本函数的下次睡眠延迟                                                                  if not fds:fds = []for function, data in list(self._idlefuns.items()):                            #遍历_idlefuns,逐个调用其中的函数,注李意这里一个技巧,拷贝构造了_idlefuns列表,如果不拷贝直接使用,那么循环体内的删除操作将会出错try:retval = function(self, data, False)if retval is False:                                                    #函数返回值为False,也就是一个逻辑假的时候,从列表中删除这个函数,并设置nextsleep为Nonedel self._idlefuns[function]nextsleep = Noneelif retval is True:                                                   #函数返回值为True,也就是逻辑真的时候,设置nextsleep为None,注意这里不删除所调用的函数,那么我们可以理解为,一个函数被持续调用,直至其返回值为假nextsleep = Noneelif isinstance(retval, float) and nextsleep:                          #若返回值为浮点类型,那么认为这个函数返回的是一个时延,选择一个较小时延给nextsleepif (retval < nextsleep):nextsleep = retvalelif nextsleep is None:                                                #nextsleep为None,那么直接进入下一个函数的处理流程continueelse:                                                                  #否则认为函数返回一个文件描述符列表fds = fds + retvalexcept SystemExit:raiseexcept Exception as exc:if not isinstance(exc, bb.BBHandledException):logger.exception('Running idle function')del self._idlefuns[function]self.quit = True        #上面循环主要是做两件事:一件事是调用所有idlefunc,第二件是找到一个最小的nextsleep# Create new heartbeat event?now = time.time()if now >= self.next_heartbeat:                                            #当前事件比心跳时间迟,认为丢失了心跳# We might have missed heartbeats. Just trigger once in# that case and continue after the usual delay.self.next_heartbeat += self.heartbeat_secondsif self.next_heartbeat <= now:self.next_heartbeat = now + self.heartbeat_seconds                #计算出一个新的心跳延迟,保障新的心跳延迟一定是在将来heartbeat = bb.event.HeartbeatEvent(now)              bb.event.fire(heartbeat, self.cooker.data)                            #触发新的心跳if nextsleep and now + nextsleep > self.next_heartbeat:                   #睡眠以后可能错过新的心跳,因此这里缩短睡眠时间# Shorten timeout so that we we wake up in time for# the heartbeat.nextsleep = self.next_heartbeat - nowif nextsleep is not None:                                                 #在睡眠周期内找到可用的文件描述符,这里需要对select有一定了解if self.xmlrpc:nextsleep = self.xmlrpc.get_timeout(nextsleep)try:return select.select(fds,[],[],nextsleep)[0]except InterruptedError:# Ignore EINTRreturn []else:return select.select(fds,[],[],0)[0]

从上面的代码分析中,可以看出来,ProessServer.main()中的ready是从fds或者是xmlrpc中选出来的,回首前程往事:

        fds = [self.sock]if self.xmlrpc:fds.append(self.xmlrpc)

只要sock就绪,那么就会进入到ready列表。

这里接下来看看_idlefuns这个列表到底是些什么函数呢?ProcessServer在构造函数中初始是置空的,但是提供了一个函数去注册idlefun:

    def __init__(self, lock, sock, sockname):multiprocessing.Process.__init__(self)self.command_channel = Falseself.command_channel_reply = Falseself.quit = Falseself.heartbeat_seconds = 1 # default, BB_HEARTBEAT_EVENT will be checked once we have a datastore.self.next_heartbeat = time.time()self.event_handle = Noneself.haveui = Falseself.lastui = Falseself.xmlrpc = Falseself._idlefuns = {}self.bitbake_lock = lockself.sock = sockself.sockname = socknamedef register_idle_function(self, function, data):"""Register a function to be called while the server is idle"""assert hasattr(function, '__call__')self._idlefuns[function] = data

进而在ProcessServer.start中将该函数传递到configuration对象:

    def _startServer(self):print(self.start_log_format % (os.getpid(), datetime.datetime.now().strftime(self.start_log_datetime_format)))server = ProcessServer(self.bitbake_lock, self.sock, self.sockname)self.configuration.setServerRegIdleCallback(server.register_idle_function)......cookerdata.py:    def setServerRegIdleCallback(self, srcb):        self.server_register_idlecallback = srcb

通篇检索yocto-sumo,系统共注册了下面函数:_process_inotify_updates,buildFileIdle,buildTargetsIdle,runCommands

下回再对这些函数进行分说。

转载于:https://www.cnblogs.com/shortnil/p/9885555.html

yocto-sumo源码解析(十): ProcessServer.idle_commands相关推荐

  1. Spring源码解析十五

    上一篇中,我们对容器ApplicationContext的初始化环节开始了初步的分析,我们已经找到了初始化的核心方法refresh.接下来我们看下refresh方法中做了哪些事情. 我们回到refre ...

  2. Spring源码解析十

    上一篇中,我们已经找到了默认标签解析入口,也就是方法parseDefaultElement,下面我们接着从这个方法分析: 我们到方法parseDefaultElement中,看下Spring是如何解析 ...

  3. Android恢复出厂设置流程分析【Android源码解析十】

    最近看恢复出厂的一个问题,以前也查过这方面的流程,所以这里整理一些AP+framework层的流程: 在setting-->备份与重置--->恢复出厂设置--->重置手机---> ...

  4. 分布式事务Seata源码解析十:AT模式回滚日志undo log详细构建过程

    文章目录 一.前言 二.准备undo log 0.undo log 样例 1)undo log表结构 2)rollback_info(回滚日志数据) 1.before image的构建 1)业务表元数 ...

  5. Mybatis源码解析(一):环境搭建

    Mybatis源码系列文章 手写源码(了解源码整体流程及重要组件) Mybatis源码解析(一):环境搭建 Mybatis源码解析(二):全局配置文件的解析 Mybatis源码解析(三):映射配置文件 ...

  6. dubbo源码解析(三十五)集群——cluster

    集群--cluster 目标:介绍dubbo中集群容错的几种模式,介绍dubbo-cluster下support包的源码. 前言 集群容错还是很好理解的,就是当你调用失败的时候所作出的措施.先来看看有 ...

  7. dubbo源码解析(十)远程通信——Exchange层

    远程通讯--Exchange层 目标:介绍Exchange层的相关设计和逻辑.介绍dubbo-remoting-api中的exchange包内的源码解析. 前言 上一篇文章我讲的是dubbo框架设计中 ...

  8. Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  9. Alink漫谈(二十) :卡方检验源码解析

    Alink漫谈(二十) :卡方检验源码解析 文章目录 Alink漫谈(二十) :卡方检验源码解析 0x00 摘要 0x01 背景概念 1.1 假设检验 1.2 H0和H1是什么? 1.3 P值 (P- ...

  10. oracle job 每月前十天运行_Tensorflow源码解析7 -- TensorFlow分布式运行时

    1 概述 TensorFlow架构设计精巧,在后端运行时这一层,除了提供本地运行时外,还提供了分布式运行时.通过分布式训练,在多台机器上并行执行,大大提高了训练速度.前端用户通过session.run ...

最新文章

  1. 【IOS 开发】Object - C 数组使用详解
  2. ASP.NET中 分析器错误:发现不明确的匹配
  3. 开源任务调度平台elastic-job-lite源码解析
  4. Linux和unix中 awk 的print浅谈
  5. Android Context应用上下文详解
  6. hibernate hql limit的实现方式
  7. matlab %3c handle,volume browser (updated).htm 源代码在线查看 - Matlab显式三维地震数据的源代码 资源下载 虫虫电子下载站...
  8. LeetCode 759. 员工空闲时间(排序)
  9. Android日志[进阶篇]四-获取错误报告
  10. linux查看进程调用接口,查看某个程序都调用哪些api函数
  11. 校招面试经验小分享,阿里腾讯美团字节实习offer
  12. CentOS7.4搭建FTP服务器(vsftp)
  13. angularjs(显示和隐身) 依赖注入
  14. java坦克大战案例_java坦克大战
  15. Nanohttpd 异常 Explicit termination medthod 'end' not called 解决方法
  16. 设计师的“通天塔”—浅谈设计沟通
  17. 六,iOS中的金额格式化和金额大小写转换
  18. 斗地主不算花色算大小王,起初发到的17张牌有多少种?
  19. 鼠标点击特效(富强,民主,文明,和谐,诚信,友善)
  20. 插入u盘计算机未响应,u盘启动电脑无反应,教您电脑插上U盘后无法启动解决方法...

热门文章

  1. EMC VNX硬盘存储硬盘告警
  2. 什么是以太网供电POE
  3. 欧美国家ADS-B设备装配进展
  4. Python猴子吃桃问题
  5. 微信小程序和APP的区别
  6. 中国供应链数字化服务行业图谱
  7. 『SQLServer』远程服务器的SqlServer设置允许本地连接
  8. [FOC-Simulink]使用Simulink代码生成工具基于STM32开发板对永磁同步电机进行开环控制
  9. 在MYSQL里使用哪种格式存储图片?之解惑总结
  10. 标签软件如何实现扫描二维码显示汉字