原文
我在arsd.core
和WebSocket
的实现上花了一些时间,websocket
现在在它的onclose
回调中提供了原因代码
,arsd.core
正式进入了repo
,并开始积累一些功能.
在此有些文档
core
模块的核心特性是一个统一
事件循环.有个满足所有模块的不同需求的实现
,并不简单,但是一个统一
接口也不是很差.
正在步进的是有四种可互操作
事件循环的方法:
1,基于simpledisplay
实现的UI
循环.这是个通用循环,应该总是
保持响应并优先考虑ui
事件.
2,基于cgi
实现的任务运行器
.这是以i/o
为中心的循环,如果需要,它可在任务
上花费一些时间,但一般
应该在响应新的请求
时保持可用
.自动分配传入
任务.
3,基于terminal
和http2
实现合并的ad-hoc
循环.这是线程
执行其他工作时,期望随机进入和退出
的通用循环.
4,助手工作者
,它与任务
运行器实现相同,但用法不同:运行
不期望保持可靠
响应的独立
任务.
我还提交更改simpledisplay
的窗口
事件函数,以便在窗口
平台上使用本地
窗口消息,以帮助解决内部
模态事件循环导致自定义
事件处理停滞的一些问题.
Linux
的实现已基本完成,正在实现窗口
(大部分已在sdpy
和cgi
中了,但是适应新系统还需要一些工作).我读了与BSD/Mac
实现相关的手册页,预计那里也不会有真实的的麻烦.
花了更多的时间考虑
线程类型,但在决定开始行动
后,看到与.net
有一些重要的相似
处时,给了我一些信心,该计划是不错的.
标准库
的std.process
对某些任务没问题,但是与子的交叉流
通信有问题.这是想要解决的问题,也是个很好的事件循环
实现的测试用例
,所以实现了个外部过程类(ExternalProcess)
及它的一些流适配器
.
该外部过程类
自身是相当普通的,它提供了从进程
传入的stdout
和stderr
数据的回调
,及向stdin
发送某些内容
的函数.但它引起事件循环
中难搞的信号处理器
问题.
我决定使用传统
的自管道技巧,只是在Linux
上使用eventfd
而不是管道
,因为除非你重置它,signalfd
屏蔽会影响子进程,而且因为我不要求所有
事情都经过我,可能不会重置.信号
处理器已够糟糕的了,但至少这些不会在execs
之间继承.它对流适配器提供了很好的测试用例.
流适配器
用它证明了自己的能力,受unix
管道的启发,一端
接收原始字节数据
,另一端
按请求格式(如int,string,array
等)输出
数据,有一个流控制:如果消费者
请求的数据不在缓冲
中,可等待
更多的数据.
在纤程
中,这会产生(yield)
直到喂了更多
的数据.因此,这是种简单
适配基于回调接口的外部过程
转换成线性
任务代码的方法."收到的数据
"回调只需要调用stream.feedData(just_received)
并再次触发
该任务.
此时仍缺少外部进程
的后压力.如果未使用流且缓冲
已满,它应该停止从管道
读,这会挂起产生数据
的另一个进程,与缓冲
为空时,挂起消费
任务一样.当前实现假设
你想读取
所有数据;到达回调
函数时,已从源管道
中读取了它,且已发出更多
数据请求.
我不得不在发布之前稍微调整一下
设计来纠正该问题.最有可能的是,我创建显式
请求更多
数据的方法,而你在回调
函数尾调用它,但其他地方也要求可调用它(如,发现缓冲不够时),因此不能只是传递
给它.
还没有完全
完成,但差不多了.
早在2015
年,我写了个叫做arsd.异常
的模块,在此,来实现一些想法,不得不让异常
更容易使用.模块
工作了,但是好处不大.有了arsd.core
,计算
方法变化了,从而提供了实际
使用这些概念
的机会.
现在关键点
是撤消D
的基本正常异常
中的一些反模式
的基类,然后是两个
平台相关错误的子类
(从simpledisplay
导入),及从参数生成
新异常类的模板
,以用在方便性和功能
上都超过throw new Exception
的替代方法.
关键目标是在方便
使用的同时向上转发
数据结构
.开始使用后,目前部分
成功.我会继续完善.
特别缺少
某种多继承.如,根据调用
函数,FileNotFound
错误可能同时是FileNotFound
异常和窗口Api
异常或Errno
异常.我想我会试按异常基础上的结构化成员
公开标签
,但我还不确定.
但即使我不能,仅附加
基本信息就比普通
异常和随机串好.
populateFromUda
反射助手arsd.core
还包括一些包括(帮助异常
框架的)intToString
到更高级反射助手的通用
帮助函数.
populateFromUda
类似SS
上次在dconf
中谈到的"蓝打印
"模式,我已在cgi.d
和minigui.d
中使用过.
Steve
的演讲:幻灯片PDF|主视频|问答视频
好处是提供了记录可能uda
及改善编译时间
的锚.此外,也可从运行时数据填充结构
,并可从文件
加载,如接口设计者的gui
输出.
放在核心
中,更容易互操作
,反射助手自身
价值有限,但如CGI
和minigui
的实际共享类型
可能更有用.针对Web
或桌面
演示重用某些表单
成员.
arsd.core
有个严格的无标准库
策略,仅允许导入object和core.*
名字空间.这是因为它是许多以前都是独立的其他
模块的基础库
.
因为一般在编译时,导入标准库
非常昂贵,并且有时,编译器
版本间不稳定,因此影响有时可能很大
.
标准库
错过了事件驱动
.虽然它提供了消息传递
,但没有实现全部潜力
.有很多反射
,但有成本.