yocto-sumo源码解析(八): ProcessServer
从前面章节的论述中,我们知道BitBakeServer实际上是一个ProcessServer,什么是ProcessServer不可不了解。
1. 类的声明: 首先这是一个python的多进程包里面的进程子类,关于多进程包可以参阅:https://docs.python.org/2/library/multiprocessing.html,在api的使用上尽量保持和多线程使用习惯一致。
class ProcessServer(multiprocessing.Process):
2. 构造函数:初始化一系列成员变量,变量命名非常易懂,这里在代码块里面进行注释
def __init__(self, lock, sock, sockname):
multiprocessing.Process.__init__(self)
self.command_channel = False #命令通道,从名字上看应该是用于接收命令请求的。
self.command_channel_reply = False #命令通道响应,从名字上看应该是用于构造命令响应的。
self.quit = False #服务是否需要退出。
self.heartbeat_seconds = 1 # default, BB_HEARTBEAT_EVENT will be checked once we have a datastore.
#心跳包间隔。
self.next_heartbeat = time.time() #下次心跳时间。 self.event_handle = None #事件处理
self.haveui = False #是否有ui
self.lastui = False #上次ui
self.xmlrpc = False #xmlrpc,这个估计用于远程过程调用。 self._idlefuns = {} #空闲函数字典 self.bitbake_lock = lock #bitbake实例锁,从这个成员看,ProcessServer的设计似乎还是偏向于给bitbake专用。
self.sock = sock #套接字,从前面上下文看,可能是域套接字。
self.sockname = sockname #套接字名字
3. 注册空闲函数:
def 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
4. run函数:对于这个,熟悉多线程的应该很有似曾相识的感觉:
def run(self):
#若xmlrpcinterface[0]不为None,或者不为False,那么建立BitBakeXMLRPCServer,应该是为了远程模式。
if self.xmlrpcinterface[0]:
self.xmlrpc = bb.server.xmlrpcserver.BitBakeXMLRPCServer(self.xmlrpcinterface, self.cooker, self) print("Bitbake XMLRPC server address: %s, server port: %s" % (self.xmlrpc.host, self.xmlrpc.port))
#设置心跳包间隔时长。
heartbeat_event = self.cooker.data.getVar('BB_HEARTBEAT_EVENT')
if heartbeat_event:
try:
self.heartbeat_seconds = float(heartbeat_event)
except:
bb.warn('Ignoring invalid BB_HEARTBEAT_EVENT=%s, must be a float specifying seconds.' % heartbeat_event)
#设置服务器超时时长。
self.timeout = self.server_timeout or self.cooker.data.getVar('BB_SERVER_TIMEOUT')
try:
if self.timeout:
self.timeout = float(self.timeout)
except:
bb.warn('Ignoring invalid BB_SERVER_TIMEOUT=%s, must be a float specifying seconds.' % self.timeout) #向锁文件写入拥有该锁的pid,如果是远程模式,同时写入主机名和端口号。
try:
self.bitbake_lock.seek(0)
self.bitbake_lock.truncate()
if self.xmlrpc:
self.bitbake_lock.write("%s %s:%s\n" % (os.getpid(), self.xmlrpc.host, self.xmlrpc.port))
else:
self.bitbake_lock.write("%s\n" % (os.getpid()))
self.bitbake_lock.flush()
except Exception as e:
print("Error writing to lock file: %s" % str(e))
pass
#调用main函数,如果配置了画像模式则建立画像流程。
if self.cooker.configuration.profile:
try:
import cProfile as profile
except:
import profile
prof = profile.Profile() ret = profile.Profile.runcall(prof, self.main) prof.dump_stats("profile.log")
bb.utils.process_profilelog("profile.log")
print("Raw profiling information saved to profile.log and processed statistics to profile.log.processed") else:
ret = self.main() return ret
yocto-sumo源码解析(八): ProcessServer的更多相关文章
- jQuery 源码解析(八) 异步队列模块 Callbacks 回调函数详解
		
异步队列用于实现异步任务和回调函数的解耦,为ajax模块.队列模块.ready事件提供基础功能,包含三个部分:Query.Callbacks(flags).jQuery.Deferred(funct) ...
 - ReactiveSwift源码解析(八) SignalProducer的代码的基本实现
		
在前面几篇博客中我们详细的聊了ReactiveSwift中的Bag.Event.Observer以及Signal的使用方式和代码实现.那么在接下来的这几篇博客中,我们就依附于之前博客的基础上来聊一聊S ...
 - Celery 源码解析八:State 和 Result
		
在前面几篇解析中,我们已经看过了 Worker 是如何运行的,Task 是如何创建的,以及怎么被路由到 Worker 中,除了这些之外,我们还对流量限制,Worker 控制和 Task/Worker ...
 - QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
		
QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...
 - Celery 源码解析三: Task 对象的实现
		
Task 的实现在 Celery 中你会发现有两处,一处位于 celery/app/task.py,这是第一个:第二个位于 celery/task/base.py 中,这是第二个.他们之间是有关系的, ...
 - Celery 源码解析五: 远程控制管理
		
今天要聊的话题可能被大家关注得不过,但是对于 Celery 来说确实很有用的功能,曾经我在工作中遇到这类情况,就是我们将所有的任务都放在同一个队列里面,然后有一天突然某个同学的代码写得不对,导致大量的 ...
 - Celery 源码解析六:Events 的实现
		
在 Celery 中,除了远程控制之外,还有一个元素可以让我们对分布式中的任务的状态有所掌控,而且从实际意义上来说,这个元素对 Celery 更为重要,这就是在本文中将要说到的 Event. 在 Ce ...
 - QT源码解析(七)Qt创建窗体的过程,作者“ tingsking18 ”(真正的创建QPushButton是在show()方法中,show()方法又调用了setVisible方法)
		
前言:分析Qt的代码也有一段时间了,以前在进行QT源码解析的时候总是使用ue,一个函数名在QTDIR/src目录下反复的查找,然后分析函数之间的调用关系,效率实在是太低了,最近总结出一个更简便的方法, ...
 - [源码解析] 并行分布式框架 Celery 之 worker 启动 (1)
		
[源码解析] 并行分布式框架 Celery 之 worker 启动 (1) 目录 [源码解析] 并行分布式框架 Celery 之 worker 启动 (1) 0x00 摘要 0x01 Celery的架 ...
 - [源码解析] 并行分布式框架 Celery 之 worker 启动 (2)
		
[源码解析] 并行分布式框架 Celery 之 worker 启动 (2) 目录 [源码解析] 并行分布式框架 Celery 之 worker 启动 (2) 0x00 摘要 0x01 前文回顾 0x2 ...
 
随机推荐
- 时间复杂度 NOIP_2017_D1T2
			
有的题做了很久\感想比较深\可以引申很多\上台讲过,所以单开一篇,不放在总结下面. 这道题做的时候花了很长时间,犯的错也比较典型,当时写过一篇单独的总结,放在学校了,返校后粘上来. 时间复杂度 小明正 ...
 - 【CF1009F】Dominant Indices
			
题目 长链剖分板子题啊 长链剖分有几个神奇的性质 所有长链的总点数为\(n\) 任意一个点的\(k\)级祖先所在长链的长度肯定不小于\(k\) 从任意点到根经过的短边数量不超过\(\sqrt{n}\) ...
 - 【转】 Android xml中 @和?区别,style和attr小结
			
引用资源时,使用@还是?的区别,例如在设置style的时候既可以使用@也可以使用? style="?android:attr/progressBarStyleHorizontal" ...
 - kong安装
			
1 哪些企业在用KONG: Mashapoe Marketplace Buzzlogix Gengo IBM Intel OpenDNS 饿了么 Kong可与两种不同的组件协同工作: Nginx:Ko ...
 - docker Dockerfile 创建镜像
			
Docker 组件 1. docker client : docker的客户端 2. docker server : docker daemon的主要组成部分,接受用户通过docker client发 ...
 - 机器学习中的特征缩放(feature scaling)
			
参考:https://blog.csdn.net/iterate7/article/details/78881562 在运用一些机器学习算法的时候不可避免地要对数据进行特征缩放(feature sca ...
 - (oralce)pga_aggregate_target与workarea_size_policy相互关系验证
			
pga_aggregate_target与workarea_size_policy相互关系验证 先放上结论: 1. 当pga_aggregate_target设置为非0, 手工设置(workarea ...
 - 【转载】基于MFC的ActiveX控件开发(1)
			
原文:http://iysm.net/?p=114 ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中.在VC下ActiveX控件的开发可以分为三种,一 ...
 - 19-[模块]-xml
			
1.xml协议 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融 ...
 - 14-[mysql内置功能]--视图,触发器,存储过程,事务
			
1.视图 (1)准备数据 /* 数据导入: Navicat Premium Data Transfer Source Server : localhost Source Server Type : M ...