在D(node.js样式)中执行异步套接字和文件io

在D(node.js样式)中执行异步套接字和文件io,d,D,异步io的D方式是什么?我说的是基于select/epoll的单(大部分)线程操作 我正在考虑链接到lib_-uv,然后用C风格编程(或者围绕lib_-uv调用编写一些简洁的类),但这是最好的选择吗 我希望做的是: //伪代码 服务器; 侦听(地址、端口、回调); 无效回调(错误,套接字){ 如果(!错误){ socket.write(数据,另一个_回调); socket.bind.on_数据(数据_收到_回调); } else writeln(“连接失败”); } 正如Adam所说:是一个很棒

异步io的D方式是什么?我说的是基于select/epoll的单(大部分)线程操作

我正在考虑链接到lib_-uv,然后用C风格编程(或者围绕lib_-uv调用编写一些简洁的类),但这是最好的选择吗

我希望做的是:

//伪代码
服务器;
侦听(地址、端口、回调);
无效回调(错误,套接字){
如果(!错误){
socket.write(数据,另一个_回调);
socket.bind.on_数据(数据_收到_回调);
}
else writeln(“连接失败”);
}
正如Adam所说:是一个很棒的库,通常是D语言中异步编程的最佳选择。 作为对将来可能会发现这个问题的其他人的简短介绍,这里有一个服务于文件的Vibe.d的最小示例

请注意,Vibe.d中的路由是光纤,并且(大多数)Vibe.d函数是异步的。例如,在读取文件时,执行将被交给事件队列中的下一个光纤,并在操作系统发回请求的数据后恢复。 此外,Vibe.d已经为服务文件提供了内置功能(请参见
/b
),它只允许请求文件的一部分

#!/usr/bin/env dub
/+ dub.sdl:
name "mini_vibed"
dependency "vibe-d" version="~>0.7.30"
versions "VibeDefaultMain"
+/

import vibe.d;

shared static this()
{
    auto settings = new HTTPServerSettings;
    settings.port = 8080;

    auto router = new URLRouter;
    router.get("/a", (scope req, scope res) {
        auto inStream = openFile(__FILE_FULL_PATH__);
        res.bodyWriter.write(inStream);
    });
    router.get("/b", serveStaticFile(__FILE_FULL_PATH__));
    router.get("*", (scope req, scope res) {
        res.writeBody("Please try /a or /b");
    });

    listenHTTP(settings, router);
}
chmod+x
运行该文件或使用
dub--single

如果您只想进行异步编程,请查看

您可以在上浏览更多示例。

是关于此主题的典型帖子。它有一个用光纤库包装的异步库,因此您可以线性调用它们的函数,并将其转换为异步,以避免太多的回调层。