d亚当4月03工作
原文
我收到抱怨,说很难使用arsd.archive
的lzma
解码器,所以做了个新接口
.它好多了,我决定也为gzip
做一样的.新函数如下:
gzip
lzma
(文档几乎相同,它们应该与相关项目相同,但显然我需要查看adrdox
中有一个错误.但工作方式
相同,因此交换算法
与交换函数名
一样简单,而不是像以前那样使用完全
不同对象)
新函数通过闭包
干活:要解压缩
数据准备就绪时,它会调用你的块接收器
,并在需要更多
数据时调用你的缓冲填充器
.然后,如果不喜欢默认值,可做一些
配置.
我可能仍会更改它,以便块接收器
可返回一个值,告诉它你已受够了,请尽早停止
处理文件.但除此外,我对此很满意.它管理缓冲
与对象
.
一般,对象
是外部
驱动的,正确
数据在正确
的位置时,可调用它们的内部驱动函数
,需要你在正确
的位置放正确
数据时,它们会调用
你的函数.
外部
驱动的可更灵活(尽管在缓冲填充器
中有纤程
提供大部分灵活性
,但它有自己的问题),但内部
驱动总是
更容易使用.对这些,现在读取tar.gz
或tar.xz
很简单,因为这些函数
可直接相互填充.
在此,从内存或文件
中取数据
来填充缓冲
很简单,但从网络流中取
可能有点困难.好吧,它不一定是,可做阻塞调用socket.receive
,无论它填满
多少缓冲,你返回
函数,它都会利用
它.所以用阻塞
接收函数,它仍易于使用.
使用非阻塞
函数呢,如何取就绪通知数据?这里外部驱动
对象更好.但是,你可用纤程
.
启动纤程
并从那里调用解压缩
函数.请求
数据时,异步读取
请求缓冲(或可中间
缓冲流式传输,但如果大小
适当,则一般直接
更好),并产生(yield)
.
读完
后,事件
处理器调用纤程
,然后它返回
到解压缩
程序并继续工作.它用外部驱动
的数据源,及内部
驱动API
,代价是记住在纤程
内部运行它.很好.
目录监听程序
我继续arsd.core
工作,包括添加目录监听器
类.我碰巧在周末打开了bsd
框,所以我从基于kqueue
的实现开始,然后,不爽.
我听说过很多关于kqueue
的好东西,但直到最近我自己才使用它,虽然有一些我喜欢它的地方它的信号方案比Linux
提供的要好,并且添加和等待组合还可(虽然它不像某些人说的那么好,但有时很高兴)但总之,我更喜欢Linux
的epoll,timerfd,eventfd
等方式.当然,窗口
提供了许多不错的函数.
现在已用了一些kqueue
,窗口
的函数和Linux
的inotify
同样,Kqueue
是其中令人失望的一个.你必须打开目录
和目录
自身中的每个文件,而窗口
和Linux
会从单个顶层
告诉你更改了什么.
因此,支持kqueue
系统对API
设计有一些重大影响.我想带glob
模式并在那扫描
它们,也许在其他系统上搞个自动
过滤器.
工具函数
arsd.core
也在从其他
模块中取分散
工具函数并整合
它们,并可编写一些小函数
.
其中之一是flagsToString
函数.这样:
en Flags {none = 0,a = 1,b = 2
}
assert(flagsToString!Flags(3) == "a | b");
主要是为了支持
错误消息,其他地方也可能有用.
网络助手
我还开始从其他模块移植
一些网络助手并统一接口.UDP
监听器可安装每线程
或任意
线程回调.TCP
监听器可自动
分发连接
给自己的工作线程
.本地
命名管道和unix
套接字可用它或单独接口
,来帮助处理单实例
程序等.