关于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,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...
随机推荐
- 【数值计算方法】线性方程组迭代算法的Python实现
线性方程组迭代算法的Python实现 jacobi,GS,SOR迭代法 def JacobiIter(A:np.ndarray, b:np.ndarray, tol:float=1e-5, maxIt ...
- 多版本Java 配置记录
来自 https://blog.csdn.net/zdl177/article/details/105246997 起因是为了启动MC 目录结构 Java总目录下放置多个jdk目录(jdk16.0.2 ...
- Python 加上颜色进行输出
博客地址:https://www.cnblogs.com/zylyehuo/ print(f"\033[42m文本内容\033[0m")
- 利用队列的内置模块(deque)模拟 Linux 下的 tail 命令(输出文件中最后几行的内容)
博客地址:https://www.cnblogs.com/zylyehuo/ # -*- coding: utf-8 -*- from collections import deque def tai ...
- nginx 部署配置
下载nginx 包(http://nginx.org/en/download.html) nginx常用命令: nginx -s stop 快速关闭Nginx,可能不保存相关信息,并终止w ...
- 多态的成员访问特点和好处--java进阶day02
1.多态的成员访问特点 1.成员变量访问特点 分为两个阶段,编译阶段,系统会看父类中是否存在该成员变量,如果存在,运行阶段就会使用父类的成员变量,否则报错 当我们在父类中删去num时,编译直接报错 2 ...
- JSON对象、JSON字符串和Java对象互相转
JSON对象.JSON字符串和Java对象互相转 Java对象转json字符串(一般使用字符串存储redis或者数据库) public static String toJSONString(Objec ...
- AQS的release(int)方法底层源码
一.定义 release(int) 是 AQS(AbstractQueuedSynchronizer)中的一个核心方法,用于在独占模式下释放同步状态.如果释放成功,则会唤醒等待队列中的后继节点,使其有 ...
- 基于XML的方式配置AOP
第一步:把通知类用 bean 标签配置起来 <bean id="txManager" class="com.atguigu.account.utils.Transa ...
- 🎀gh-ost工具介绍及使用
简介 gh-ost 是一款由GitHub开发的在线DDL(Online Data Definition Language)变更工具,专门用于MySQL数据库.它允许在不锁定表的情况下执行数据库模式变更 ...