当Odoo启动的那一刻,到底发生了什么?

在早期odoo的源码研读中,我们粗浅的了解了odoo前后端交互的流程:【Odoo框架源码研读一:前后端交互】

而对于odoo在启动过程中的细节以及相关设计还缺乏细致的了解。

这次,我们想从odoo启动的那一刻开始,逐步了解odoo的整个生命周期以及其中细节,最终实现从0开始构建一套完整的odoo框架。

本期将会从odoo的启动命令说起,至web服务器的创建结束,详细了解odoo的启动过程~

#Odoo启动时,系统有哪些准备?

Odoo启动时,会调用主函数。

Odoo启动时,通过Odoo-bin启动文件启动,会调用command.py中的main函数,这里是Odoo启动的最初源头,是一切开始的地方。

这里可以看到server命令正准备执行,main方法的作用是分析命令行中的参数,匹配正确的命令,执行对应的操作。因为默认的命令是server,因此默认情况下,我们就启动了odoo的主服务进程

看过command的定义之后,可以确定这七个command其实是Odoo提供的工具命令:

help: 帮助
cloc: 用来统计代码行数和字数的工具
deploy: 发布模块的工具
scaffold: 创建第三方模块脚手架程序
populate: 自动化生成测试数据的工具
server: 启动的默认方法,启动主程序
shell: odoo的shell环境
start: 快速启动odoo服务器的命令

#Odoo的启动方式

server是Odoo的主程序 ,也是我们研究的重点。其主要的核心文件就是cli模块下的server.py文件。

odoo-bin文件启动过后,会执行server.py中的main函数。

这里可以看到,主程序启动过后,主要会检查启动用户是否是root用户以及postgres用户,继而检查csv文件大小不能超过500M。检查完这些之后,程序会根据workers配置项来启动server服务器。

server主程序的启动类型主要分为三种,这三种都继承于CommonServer:

类型一:ThreadedServer

多线程模式驱动的进程。

类型二:GeventServer

使用Gevent协程的Server。

类型三:PreforkServer

Gunicorn驱动的多进程实例。

接下来我们会详细为大家介绍一下不同类型的启动方式。

1、ThreadedServer模式下的启动

默认情况下,系统是以ThreadedServer方式启动。即:

线程模式下的启动会同时启动HttpServer和定时任务线程CronThread。

仔细看下cron_spawn()方法,我们可以看出,此处是根据 max_cron_threads这个配置参数来确定开启线程的数量。

在方法start中新开了一个线程来执行self.http_thread。

而http_thread()则创建了一个ThreadedWSGIServerReloadable对象。

传入的app即是前面说过的

openerp.service.wsgi_server.application。

通过代码可以知道:

ThreadedWSGIServerReloadable源于

werkzeug.serving.ThreadedWSGIServer。

接着调用server_forever()启动服务,监听请求。当请求来临时,根据WSGI协议:

openerp.service.wsgi_server.application方法会被调用。

2、Gevent模式下的启动

Gevent模式下同样使用的是WSGISever,不同的是使用gevent协程方式启动。

Gevent模式默认工作在8072端口,也就是长连接端口。顾名思义,GeventServer是用来处理长连接请求的服务,单进程模式下一般不使用此模式。

3、PreforkServer模式下的启动

PreforkServer模式下,进程会fork出多个进程,然后将多个进程的父进程指定为第一个进程,再调用worker的run方法启动。

**PreforkServer采用gunicorn驱动,**启动之后处理完进程信号、僵死进程、超时进程之后开始孵化新的进程。在孵化新进程过程中,会创建一个GeventServer用来处理长连接的任务。

#当Odoo启动后

主进程启动之后,odoo就进入到了监听模式。odoo处理HTTP请求的入口是http.py文件中的Root类。

我们来看一下Root的核心方法:

从中我们可以看出,odoo会判断当前进程是否加载的addons模块,没有加载则启动加载程序,最后再进入监听模式。

Root类的核心是dispatch方法,它负责给请求挂载session、绑定数据库、设置语言环境,以及处理一些请求中的异常。

接下来的部分就是我们很熟悉的Request部分的内容了。

#回顾整个流程

经过上文的讲解,我们再来回顾一下整个流程,以便更好地理解:

通过这个流程,可以一目了然的看到在启动Odoo时,我们先通过系统配置文件,进入启动程序,再选择不同的类型,执行启动,最后就可以用源码运行啦。

我们想用最简单的方式讲清楚一个复杂的道理~

具体的实现路径及方法原理已奉上,希望有更多的小伙伴能够掌握其中的奥秘,一起构建更好的生态!

版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。
公众号搜索神州数码云基地,后台回复Odoo,加入Odoo技术交流群。

Odoo启动过程详解相关推荐

  1. Linux开启动过程详解

    Linux开启动过程详解 Linux启动过程 前言: Linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布.在加上用户空间的应用程序之后 ...

  2. centos7 启动流程图_Linux启动过程详解

    Linux启动过程详解 作者:江远航 一.启动流程图如下 图1 Linux启动流程图 BIOS ---> MBR ---> Kernel---> Init 二.Linux启动顺序 一 ...

  3. Delta3d框架学习--程序启动过程详解

    一个Delta3d程序启动过程详解 一.初始化一个dtGame::GameApplication的实例,dtGame::GameApplication* app = new dtGame::GameA ...

  4. 朱老师ARM裸机学习笔记(四):S5PV210启动过程详解

    常用器件特性 内存: SRAM 静态内存 特点就是容量小.价格高,优点是不需要软件初始化直接上电就能用 DRAM 动态内存 特点就是容量大.价格低,缺点就是上电后不能直接使用,需要软件初始化后才可以使 ...

  5. Spring启动过程详解

    Spring启动过程详解 前言 spring容器启动过程 AnnotationConfigApplicationContext 有参数构造方法 无参数构造 AnnotatedBeanDefinitio ...

  6. linux efi 启动原理,Linux(RHEL6)启动过程详解

    Linux(RHEL6)启动过程详解 Linux(红帽RHEL6)启动过程详解: RHEL的一个重要和强大的方面是它是开源的,并且系统的启动过程是用户可配置的.用户可以自由的配置启动过程的许多方面,包 ...

  7. 嵌入式linux的u-boot系统启动过程,【站友投递】U-boot启动过程详解

    [站友投递]U-boot启动过程详解 来源:互联网 作者:denny 时间:2009-03-18 Tag:点击: 一.U-BOOT的目录结构 u-boot目录下有18个子目录,分别存放管理不通的源程序 ...

  8. 家用计算机启动过程 装载主引导记录,计算机启动过程详解

    综述: 计算机启动时经过了哪些过程: 计算机接通电源后,第一步要进行加电自检,也就是POST(Power On Self Test),检查RAM.驱动器等:第二步BIOS会读取活动分区主引导记录的启动 ...

  9. SpringBoot启动过程详解

    Spring Boot通常有一个名为*Application的入口类,在入口类里有一个main方法,这个main方法其实就是一个标准的java应用的入口方法. 在main方法中使用SpringAppl ...

最新文章

  1. tar.xz、tar.bz2 压缩包解压方式
  2. 11月29日云栖精选夜读:阿里传奇工程师多隆的程序世界
  3. TCP的三次握手、四次挥手,含泪整理面经
  4. 快速排序 java 实现
  5. Ubuntu安装Chrome最新版
  6. 检索数据_12_从表中随机返回N条记录
  7. 3. 什么是icmp?icmp与ip的关系_你知道如何跟女生,确定恋人关系吗?
  8. HoloLens开发手记-全息Hologram
  9. 关于异常:HttpURLConnectionImpl cannot be cast to javax.net.ssl.HttpsURLConnection的解决办法
  10. 下载腾讯视频里的视频_手机腾讯视频如何升级新版本
  11. DeepMind去年亏损27亿元,同比扩大221%,谷歌说:继续烧
  12. Atitit.创业之uke团队规划策划 v9
  13. x2分布临界值表(卡方分布)
  14. 【游戏测试】游戏兼容性测试(通用方案)
  15. cad计算机配置要求,CAD对电脑硬件的配置要求
  16. linux中的设备管理
  17. Python中pandas.Dataframe数据筛选
  18. 好嗨呦 之 快速部署 Spring Boot 项目
  19. mysql安装以及安装navicat并且连接
  20. 手风琴效果(vue实现)

热门文章

  1. 固定波束形成:LS波束形成
  2. React实现大转盘抽奖效果
  3. 阿里巴巴代码规范学习+redis stream
  4. 【深度学习实战】---TensorBoard网络可视化
  5. java web选择题_Servlet、JSP选择题
  6. 上海交通大学计算机系张伟楠,重点实验室系列学术报告:上海交通大学张伟楠...
  7. Oracle更新语句
  8. binance里面如何进行充值
  9. Android开发-动态获取电视盒子U盘的插拔状态和路径
  10. Linux 配置和安装Oracle DG时遇到的报错及解决方案