关于dpnet项目
关于dpnet项目
dpnet是我开源的一个轻量异步框架,主要用于利用多核优势执行异步任务,处理异步IO。
起初并没有独立的dpnet项目,所有功能集成在另一个项目dplua中。
提到异步,实现方案必然是回调或协程二选其一。基于回调的异步网络库以libuv,libevent最广为人知。
在协程兴起后,现在更多的开发者选择使用协程处理异步。或使用go这种天然支持协程的语言。
而Lua的协程实现是我非常喜欢的。所以就开始了dplua开发。
后来我参考了一些C语言的协程实现,实现了当前dpnet使用的协程库。基于该协程库,将原dplua中的核心部分独立出来并构建了dpnet项目。
而现在dplua使用dpnet除协程外的核心部分,dplua反倒成了dpnet的附属项目。
异步IO
在Linux下,异步IO的主要实现方式是epoll,poll,select。在新版本Linux内核中,更是提供了io_uring这种新技术。相信io_uring以后会成为Linux平台下异步IO的主流选择,目前已经出现了一些基于此的库或框架。
dpnet仍然使用了epoll方案,并且计划支持kqueue。其实我非常期待FreeBSD中io_uring的实现,所以未来FreeBSD的io_uring开发出来时,可能会重新开发一个新的东西。
dpnet包装了一个dpepfd的结构,使用非阻塞fd + 协程,可以很方便的实现异步IO。在发出IO请求时,如果fd没有数据,或数据不足,dpepfd会记录数据,IO位置等信息,这在流式IO中主要依赖dpbuf。之后会将协程挂起,dpevp内部在轮询到事件后自动执行IO操作,直到IO完成或出错,唤醒协程。
原理其实看上去很简单,实际使用时需要注意阻塞操作会大大降低整体的性能。
多线程
dpnet使用多线程,他不是线程池,所有的线程都在dpnet启动时指定并创建。之后线程内部调用模块中的对应初始化函数,开始执行逻辑。
dpnet首先定义的是线程类型,你可以把它理解为线程组,每一类线程都可以通过命令行参数指定其需要创建的线程数量。不同类线程都执行不同的模块入口函数。这在项目的README.md文档中有介绍。
但类型和线程数量不能无限大,所以根据一些经验,以及为了之后分布式部署准备,dpnet限制每个dpnet实例最多有63个线程类型,线程总数不能超过255个。对于应用和CPU而言,这个限制应该已经足够了。如果不够可以再启动新的dpnet实例。
一个线程被创建后,首先会初始化专属这个线程的事件循环,然后初始化协程环境,最后在协程中执行模块的初始化函数。
如果在命令行中指定某类型线程数量为0,则该类型下不会创建线程,但是该类型会附加到master线程中,并在master线程执行该类型线程的初始化方法。
实际上每个线程都是独立的,他们不共享任何数据。他们之间唯一的联系就是通过master线程传递异步任务。
异步任务
在任务README.md文档中介绍了一部分实现的细节。其实这部分主要分歧集中在任务队列的实现上,比如lockfree的队列,或者lockfree的环形队列。这在boost的lockfree模块中已经有了实现。尤其是lockfree环形队列的性能是非常高的。
但是这些队列的问题在于没有通知机制。事件循环不能没有计划的轮询,这会大大浪费CPU,但是不轮询没有办法及时知道队列上有没有消息。eventfd可以满足在epoll中实现事件通知。如何将队列和eventfd结合起来,变成一个通知队列?答案就是现在dpnet的实现。
经过不严谨的测试,dpnet实现的队列比boost lockfree队列性能要高很多。但比lockfree环形队列性能低不少。这算是一个性能和功能上相对平衡的实现。
可以干什么
说了这么多,dpnet可以干什么是个问题。
其实就我个人工作而言,最需要的就是基于异步任务,构建异步执行DAG的调度系统。可以将不同的类型的任务分配到不同的线程中执行。比如:耗时任务可以分配到01线程组,IO任务可以分配到02线程组,等等。并且可以根据业务场景的不同,调整不同组中线程的数量。很显然目前的dpnet是可以满足这个需求的,接下来我希望它能够支持集群,将任务自动分配到不同的机器上执行。
你也可以使用dpnet实现网络服务器,游戏服务器,客户端等等,我写了一个dpresp,供有兴趣的同学参考。
甚至也可以集成glfw,imgui等库,构建一个图形化的应用。等我有空了会写一个demo。
或者说作为一个轻量的异步框架,它有很多种可能。
关于dpnet项目的更多相关文章
- 总结近期CNN模型的发展(一)---- ResNet [1, 2] Wide ResNet [3] ResNeXt [4] DenseNet [5] DPNet [9] NASNet [10] SENet [11] Capsules [12]
总结近期CNN模型的发展(一) from:https://zhuanlan.zhihu.com/p/30746099 余俊 计算机视觉及深度学习 1.前言 好久没有更新专栏了,最近因为项目的原因接 ...
- Fis3前端工程化之项目实战
Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...
- Hangfire项目实践分享
Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...
- Travis CI用来持续集成你的项目
这里持续集成基于GitHub搭建的博客为项目 工具: zqz@ubuntu:~$ node --version v4.2.6 zqz@ubuntu:~$ git --version git versi ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- Angular企业级开发(5)-项目框架搭建
1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...
- 【分享】标准springMVC+mybatis项目maven搭建最精简教程
文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...
随机推荐
- 【ARM+Qt+OpenCV】基于ARM的双目图像采集系统
点击查看代码 系统使用ARM处理器,运行linux系统,Qt创建工程编写主程序,可以使用OpenCV进行图像处理. 通过两个摄像头采集会图像,在LCD上进行显示,然后通过LCD上的按钮实现退出程序.保 ...
- C# 中的“相等判断”
C# 中的"相等判断" C# 中判断相等的方式很多,例如: 双等号 == 实例的 Equals() 方法 Object.Equals() 静态方法 Object.Refe ...
- SICK Ranger3源码分析——断线重连
前言 本文可在https://paw5zx.github.io/SICK-Ranger3-source-code-analysis-01/中阅读,体验更加 简单分析一下SICK Ranger3源码中断 ...
- 2025年我用 Compose 写了一个 Todo App
标题党嫌疑犯实锤 序言 从2月12日到3月4日这整整三周时间里,我从零开始又学习了一次 Compose. 为什么说又,是因为这已经是我第二次学习这套课程了. 故事从 4 年前说起,2021 年在意外获 ...
- python ImportError: libGL.so.1: cannot open shared object file: No such file or directory
前言 python 报错python ImportError: libGL.so.1: cannot open shared object file: No such file or director ...
- 安装卸载GNOME
只需要三步:sudo yum -y groups install "GNOME Desktop"sudo systemctl set-default graphical.targe ...
- RAFT光流估计
RAFT Introduction RAFT: Recurrent All-Pairs Field Transforms for Optical Flow:观其名便知道这是一篇关于光流估计的论文. 模 ...
- 深入理解 Java AQS 原理与 ReentrantLock 实现
目录 一.AQS 简介 二.AQS 核心设计 2.1 核心组成部分 2.2 AQS 的工作原理 2.3 AQS 的关键方法 三.ReentrantLock 与 AQS 的关系 3.1 Reentran ...
- Hack The Box-Chemistry靶机渗透
通过信息收集访问5000端口,cif历史cve漏洞反弹shell,获取数据库,利用低权限用户登录,监听端口,开放8080端口,aihttp服务漏洞文件包含,获取root密码hash值,ssh指定登录 ...
- 【Linux】3.6 组管理和权限管理
组管理和权限管理 1. Linux组基本介绍 Linux中每个用户属于一个组,不能独立于组以外.所以在Linux中每个文件存在组的概念: 所有者 所在组 其他组 改变用户所在组 2. 文件/目录所有者 ...