0
点赞
收藏
分享

微信扫一扫

d设计事件循环


​​原文​​​​结构化并发库​​具有严格的​​任务所有权​​概念.
或用D现有的​​析构器规则​​ 异步​​api​​,最好地复制​​窗口API​​.可​​回调和同步​​.​​这里​​ 我在​​arsd.http2​​中使用了类似​​模型​​,调用​​返回请求​​函数,可附加​​回调​​等,然后​​发送​​它,然后在​​需要​​时等待​​响应对象​​.我非常喜欢它,即使没有​​完整​​事件循环,也可用它,它只是根据​​需要​​一步步地​​执行​​事件循环.
我想​​扩展​​它到其他函数.但是有问题:谁​​负责​​创建这些​​响应和请求对象​​?在​​窗口API​​中,你传递指针给​​OVERLAPPED​​结构.​​node.js​​的​​libuv​​基础,也从外部​​传递​​对象指针,使你控制​​分配方式​​.
引出了问题:如果你​​创建​​了对象,为什么有个免费的​​读/写​​函数?​​Win32,libuv​​和其他人是因为在​​C​​中没有​​构造器和成员函数​​.在D中,有,因此可以把方法放在​​对象​​中.​​arsd.http2​​两样都有:​​client.request​​创建并返回​​请求对象​​,但,你也可在外部新建​​HttpRequest​​(尽管需要设置客户端才能使它正常工作,如​​cookie​​存储).
已习惯了这样的​​api​​:

ubyte[N] buffer;
auto ret = read(file, buffer.ptr, buffer.length);
//或
ubyte[N] buffer;
Request* req = malloc(Request.sizeof);
auto error = read(file, req, buffer.ptr, buffer.length);
auto response = get_async_result(req);

但可:

ubyte[N] buffer;
ReadRequest res = new ReadRequest(buffer[], new ResponseHolder());
auto response = res.get_result();

可能不必传入​​ResponseHolder​​​,因为它只是​​请求对象​​​的一部分.但是​​单独的缓冲区​​​很好,因为这样可更轻松​​复用​​​它,这是纤程一大优点.
既然需要在​​​异步​​​模式下​​分配​​​请求对象,​​成员​​​函数应很好.
顺便,我在示例中使用了​​​new​​​,但我倾向于​​@disable new();​​​.
因此,代码​​​如下所示​​:

void mytask() {
auto timeout = scoped!Timeout(500.msecs);
auto buffer = new ubyte[](1024*32);
auto readRequest = scoped!ReadOperation(file, buffer);

auto response = waitForFirstToComplete(readRequest, timeout);
if(response is timeout)
throw new Exception("读超时"); // 取消读取挂起,因为运行`readRequest`的析构器
assert(response is readRequest);
if(!readRequest.wasSuccessful)
throw new Exception("读失败");

auto data = readRequest.filledBuffer();
//处理数据
//函数返回时析构器取消超时
}


举报

相关推荐

0 条评论