mirror of
https://github.com/sogou/workflow.git
synced 2026-02-08 01:33:17 +08:00
Update README_cn.md
This commit is contained in:
41
README_cn.md
41
README_cn.md
@@ -6,7 +6,7 @@
|
||||
[](https://img.shields.io/badge/platform-linux%20%7C%20macos20%7C%20windows-lightgrey.svg)
|
||||
[](https://github.com/sogou/workflow/actions?query=workflow%3A%22ci+build%22++)
|
||||
|
||||
搜狗公司C++服务器引擎,支撑搜狗几乎所有后端C++在线服务,包括所有搜索服务,云输入法,在线广告等,每日处理超百亿请求。这是一个设计轻盈优雅的企业级程序引擎,可以满足大多数C++后端开发需求。
|
||||
搜狗公司C++服务器引擎,编程范式。支撑搜狗几乎所有后端C++在线服务,包括所有搜索服务,云输入法,在线广告等,每日处理数百亿请求。这是一个设计轻盈优雅的企业级程序引擎,可以满足大多数后端与嵌入式开发需求。
|
||||
#### 你可以用来:
|
||||
* 快速搭建http服务器:
|
||||
~~~cpp
|
||||
@@ -77,7 +77,7 @@ make
|
||||
* 计算任务
|
||||
* [使用内置算法工厂:sort_task](docs/tutorial-07-sort_task.md)
|
||||
* [自定义计算任务:matrix_multiply](docs/tutorial-08-matrix_multiply.md)
|
||||
* [更加简单的使用计算任务:go_task](docs/about-go-task.md)
|
||||
* [更加简单的使用计算任务:go_task](docs/about-go-task.md)【推荐】
|
||||
* 文件异步IO任务
|
||||
* [异步IO的http server:http_file_server](docs/tutorial-09-http_file_server.md)
|
||||
* 用户定义协议基础
|
||||
@@ -99,9 +99,9 @@ make
|
||||
* [异步kafka客户端:kafka_cli](docs/tutorial-13-kafka_cli.md)
|
||||
* [异步DNS客户端:dns_cli](docs/tutorial-17-dns_cli.md)
|
||||
|
||||
#### 系统设计特点
|
||||
#### 编程范式
|
||||
|
||||
我们认为,一个典型的后端程序由三个部分组成,并且完全独立开发。即:程序=协议+算法+任务流。
|
||||
程序 = 协议 + 算法 + 任务流
|
||||
* 协议
|
||||
* 大多数情况下,用户使用的是内置的通用网络协议,例如http,redis或各种rpc。
|
||||
* 用户可以方便的自定义网络协议,只需提供序列化和反序列化函数,就可以定义出自己的client/server。
|
||||
@@ -115,30 +115,29 @@ make
|
||||
* 典型的任务流是一个闭合的串并联图。复杂的业务逻辑,可能是一个非闭合的DAG。
|
||||
* 任务流图可以直接构建,也可以根据每一步的结果动态生成。所有任务都是异步执行的。
|
||||
|
||||
基础任务,任务工厂与复合任务
|
||||
* 我们系统中包含六种基础任务:通讯,文件IO,CPU,GPU,定时器,计数器。
|
||||
* 一切任务都由任务工厂产生,并且在callback之后自动回收。
|
||||
* server任务是一种特殊的通讯任务,由框架调用任务工厂产生,通过process函数交给用户。
|
||||
* 大多数情况下,用户通过任务工厂产生的任务,都是一个复合任务,但用户并不感知。
|
||||
结构化并发与任务隐藏
|
||||
* 我们系统中包含五种基础任务:通讯,计算,文件IO,定时器,计数器。
|
||||
* 一切任务都由任务工厂产生,用户通过调用接口组织并发结构。例如串联并联,DAG等。
|
||||
* 大多数情况下,用户通过任务工厂产生的任务,都隐藏了多个异步过程,但用户并不感知。
|
||||
* 例如,一次http请求,可能包含许多次异步过程(DNS,重定向),但对用户来讲,就是一次通信任务。
|
||||
* 文件排序,看起来就是一个算法,但其实包括复杂的文件IO与CPU计算的交互过程。
|
||||
* 如果把业务逻辑想象成用设计好的电子元件搭建电路,那么每个电子元件内部可能又是一个复杂电路。
|
||||
* 任务隐藏机制大幅减少了用户需要创建的任务数量和回调深度。
|
||||
* 任何任务都运行在某个串行流(series)里,共享series上下文,让异步任务之间数据传递变得简单。
|
||||
|
||||
异步性和基于``C++11 std::function``的封装
|
||||
* 不是基于用户态协程。使用者需要知道自己在写异步程序。
|
||||
回调与内存回收机制
|
||||
* 一切调用都是异步执行,几乎不存在占着线程等待的操作。
|
||||
* 虽然我们也提供一些便利的半同步接口,但并不是核心的功能。
|
||||
* 尽量避免派生,以``std::function``封装用户行为,包括:
|
||||
* 显式的回调机制。用户清楚自己在写异步程序。
|
||||
* **通过一套对象生命周期机制,大幅简化异步程序的内存管理**
|
||||
* 任何框架创建的任务,生命周期都是从创建到callback函数运行结束为止。没有泄漏风险。
|
||||
* 如果创建了任务之后不想运行,则需要通过dismiss()接口删除。
|
||||
* 任务中的数据,例如网络请求的resp,也会随着任务被回收。此时用户可通过``std::move()``把需要的数据移走。
|
||||
* 项目中不使用任何智能指针来管理内存。代码观感清新。
|
||||
* 尽量避免用户级别派生,以``std::function``封装用户行为,包括:
|
||||
* 任何任务的callback。
|
||||
* 任何server的process。符合``FaaS``(Function as a Service)思想。
|
||||
* 一个算法的实现,简单来讲也是一个``std::function``。但算法也可以用派生实现。
|
||||
|
||||
内存回收机制
|
||||
* 任何任务都会在callback之后被自动内存回收。如果创建的任务不想运行,则需要通过dismiss方法释放。
|
||||
* 任务中的数据,例如网络请求的resp,也会随着任务被回收。此时用户可通过``std::move()``把需要的数据移走。
|
||||
* SeriesWork和ParallelWork是两种框架对象,同样在callback之后被回收。
|
||||
* 如果某个series是parallel的一个分支,则将在其所在parallel的callback之后再回收。
|
||||
* 项目中不使用``std::shared_ptr``来管理内存。
|
||||
* 一个算法的实现,简单来讲也是一个``std::function``。
|
||||
* 如果深入使用,又会发现一切皆可派生。
|
||||
|
||||
# 使用中有疑问?
|
||||
可以先查看[FAQ](https://github.com/sogou/workflow/issues/170)和[issues](https://github.com/sogou/workflow/issues)列表,看看是否能找到答案。
|
||||
|
||||
Reference in New Issue
Block a user