从前面章节的论述中,我们知道BitBakeServer实际上是一个ProcessServer,什么是ProcessServer不可不了解。

1. 类的声明: 首先这是一个python的多进程包里面的进程子类,关于多进程包可以参阅:https://docs.python.org/2/library/multiprocessing.html,在api的使用上尽量保持和多线程使用习惯一致。

  1. class ProcessServer(multiprocessing.Process):

2. 构造函数:初始化一系列成员变量,变量命名非常易懂,这里在代码块里面进行注释

  1. def __init__(self, lock, sock, sockname):
  2. multiprocessing.Process.__init__(self)
  3. self.command_channel = False                 #命令通道,从名字上看应该是用于接收命令请求的。
  4. self.command_channel_reply = False           #命令通道响应,从名字上看应该是用于构造命令响应的。
  5. self.quit = False                            #服务是否需要退出。
  6. self.heartbeat_seconds = 1 # default, BB_HEARTBEAT_EVENT will be checked once we have a datastore.
                                                         #心跳包间隔。
  7. self.next_heartbeat = time.time()            #下次心跳时间。
  8.  
  9. self.event_handle = None                     #事件处理
  10. self.haveui = False                          #是否有ui
  11. self.lastui = False                          #上次ui
  12. self.xmlrpc = False                          #xmlrpc,这个估计用于远程过程调用。
  13.  
  14. self._idlefuns = {}                          #空闲函数字典
  15.  
  16. self.bitbake_lock = lock                     #bitbake实例锁,从这个成员看,ProcessServer的设计似乎还是偏向于给bitbake专用。
  17. self.sock = sock                             #套接字,从前面上下文看,可能是域套接字。
  18. self.sockname = sockname                     #套接字名字

3. 注册空闲函数:

  1. def register_idle_function(self, function, data):
  2. """Register a function to be called while the server is idle"""
  3. assert hasattr(function, '__call__')
  4. self._idlefuns[function] = data

4. run函数:对于这个,熟悉多线程的应该很有似曾相识的感觉:

  1. def run(self):
  2.         #若xmlrpcinterface[0]不为None,或者不为False,那么建立BitBakeXMLRPCServer,应该是为了远程模式。
  3. if self.xmlrpcinterface[0]:
  4. self.xmlrpc = bb.server.xmlrpcserver.BitBakeXMLRPCServer(self.xmlrpcinterface, self.cooker, self)
  5.  
  6. print("Bitbake XMLRPC server address: %s, server port: %s" % (self.xmlrpc.host, self.xmlrpc.port))

  7.         #设置心跳包间隔时长。
  8. heartbeat_event = self.cooker.data.getVar('BB_HEARTBEAT_EVENT')
  9. if heartbeat_event:
  10. try:
  11. self.heartbeat_seconds = float(heartbeat_event)
  12. except:
  13. bb.warn('Ignoring invalid BB_HEARTBEAT_EVENT=%s, must be a float specifying seconds.' % heartbeat_event)

  14.         #设置服务器超时时长。
  15. self.timeout = self.server_timeout or self.cooker.data.getVar('BB_SERVER_TIMEOUT')
  16. try:
  17. if self.timeout:
  18. self.timeout = float(self.timeout)
  19. except:
  20. bb.warn('Ignoring invalid BB_SERVER_TIMEOUT=%s, must be a float specifying seconds.' % self.timeout)
  21.  
  22.         #向锁文件写入拥有该锁的pid,如果是远程模式,同时写入主机名和端口号。
  23. try:
  24. self.bitbake_lock.seek(0)
  25. self.bitbake_lock.truncate()
  26. if self.xmlrpc:
  27. self.bitbake_lock.write("%s %s:%s\n" % (os.getpid(), self.xmlrpc.host, self.xmlrpc.port))
  28. else:
  29. self.bitbake_lock.write("%s\n" % (os.getpid()))
  30. self.bitbake_lock.flush()
  31. except Exception as e:
  32. print("Error writing to lock file: %s" % str(e))
  33. pass

  34.         #调用main函数,如果配置了画像模式则建立画像流程。
  35. if self.cooker.configuration.profile:
  36. try:
  37. import cProfile as profile
  38. except:
  39. import profile
  40. prof = profile.Profile()
  41.  
  42. ret = profile.Profile.runcall(prof, self.main)
  43.  
  44. prof.dump_stats("profile.log")
  45. bb.utils.process_profilelog("profile.log")
  46. print("Raw profiling information saved to profile.log and processed statistics to profile.log.processed")
  47.  
  48. else:
  49. ret = self.main()
  50.  
  51. return ret

yocto-sumo源码解析(八): ProcessServer的更多相关文章

  1. jQuery 源码解析(八) 异步队列模块 Callbacks 回调函数详解

    异步队列用于实现异步任务和回调函数的解耦,为ajax模块.队列模块.ready事件提供基础功能,包含三个部分:Query.Callbacks(flags).jQuery.Deferred(funct) ...

  2. ReactiveSwift源码解析(八) SignalProducer的代码的基本实现

    在前面几篇博客中我们详细的聊了ReactiveSwift中的Bag.Event.Observer以及Signal的使用方式和代码实现.那么在接下来的这几篇博客中,我们就依附于之前博客的基础上来聊一聊S ...

  3. Celery 源码解析八:State 和 Result

    在前面几篇解析中,我们已经看过了 Worker 是如何运行的,Task 是如何创建的,以及怎么被路由到 Worker 中,除了这些之外,我们还对流量限制,Worker 控制和 Task/Worker ...

  4. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

  5. Celery 源码解析三: Task 对象的实现

    Task 的实现在 Celery 中你会发现有两处,一处位于 celery/app/task.py,这是第一个:第二个位于 celery/task/base.py 中,这是第二个.他们之间是有关系的, ...

  6. Celery 源码解析五: 远程控制管理

    今天要聊的话题可能被大家关注得不过,但是对于 Celery 来说确实很有用的功能,曾经我在工作中遇到这类情况,就是我们将所有的任务都放在同一个队列里面,然后有一天突然某个同学的代码写得不对,导致大量的 ...

  7. Celery 源码解析六:Events 的实现

    在 Celery 中,除了远程控制之外,还有一个元素可以让我们对分布式中的任务的状态有所掌控,而且从实际意义上来说,这个元素对 Celery 更为重要,这就是在本文中将要说到的 Event. 在 Ce ...

  8. QT源码解析(七)Qt创建窗体的过程,作者“ tingsking18 ”(真正的创建QPushButton是在show()方法中,show()方法又调用了setVisible方法)

    前言:分析Qt的代码也有一段时间了,以前在进行QT源码解析的时候总是使用ue,一个函数名在QTDIR/src目录下反复的查找,然后分析函数之间的调用关系,效率实在是太低了,最近总结出一个更简便的方法, ...

  9. [源码解析] 并行分布式框架 Celery 之 worker 启动 (1)

    [源码解析] 并行分布式框架 Celery 之 worker 启动 (1) 目录 [源码解析] 并行分布式框架 Celery 之 worker 启动 (1) 0x00 摘要 0x01 Celery的架 ...

  10. [源码解析] 并行分布式框架 Celery 之 worker 启动 (2)

    [源码解析] 并行分布式框架 Celery 之 worker 启动 (2) 目录 [源码解析] 并行分布式框架 Celery 之 worker 启动 (2) 0x00 摘要 0x01 前文回顾 0x2 ...

随机推荐

  1. FFI (语言交互接口(Foreign Function Interface))

    FFI(Foreign Function Interface)是用来与其它语言交互的接口, 在有些语言里面称为语言绑定(language bindings), Java 里面一般称为 JNI(Java ...

  2. hdu 4803 Poor Warehouse Keeper(贪心+数学)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011328934/article/details/26005267 题目链接:hdu 4803 P ...

  3. Dictionary<string, object>

    Dictionary<string, object> dcic = JsonHelper.DataRowFromJSON(resultdepth); foreach (var depthk ...

  4. 最简单的方式在linux上升级node.js版本

    node的升级频率太高,n模块来升级是最方便的,网上看了很多资料介绍使用n模块,但是安装n模块之后却经常找不到这个命令  很多同学安装之后直接去使用n会发现命令不存在,就停留在这一步无法前进了. 解决 ...

  5. Odoo的@api.装饰器

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9281437.html Odoo自带的api装饰器主要有:model,multi,one,constrains, ...

  6. openstack常用的一些命令

    查看rabbitmq 队列 rabbitmqctl list_queues 复制代码 查看keystone的用户 keystone user-list 复制代码 查看keystone endpoint ...

  7. Docker删除/停止容器

    应用场景:某个相关的业务需要重启,容器太多了,一个一个通过命令行来关闭太麻烦了,直接一条命令直接搞定. 命令如下: $ docker ps // 查看所有正在运行容器 $ docker stop co ...

  8. Vue滚动加载自定义指令

    用Vue在移动端做滚动加载,使用mint-ui框架, InfiniteScroll指令loadmore组件,在uc浏览器和qq浏览器都无法触发.无奈我只能自己写了. 决定用vue 的自定义指令 写滚动 ...

  9. JDBC连接池使用

    一:一个服务在操作数据库的操作的时候,连接和关闭资源是很消耗系统的资源,不能再每次用户操作数据库的时候,都需要重新建立连接和 关闭连接. 如果这样操作的话,对系统和用户来说,都会消耗大量的资源.所以操 ...

  10. JDBC数据对象存储

    一:将查询的结果生成对象,储存在数组中. package day31; import java.sql.Connection; import java.sql.PreparedStatement; i ...