在D(node.js样式)中执行异步套接字和文件io
异步io的D方式是什么?我说的是基于select/epoll的单(大部分)线程操作 我正在考虑链接到lib_-uv,然后用C风格编程(或者围绕lib_-uv调用编写一些简洁的类),但这是最好的选择吗 我希望做的是:在D(node.js样式)中执行异步套接字和文件io,d,D,异步io的D方式是什么?我说的是基于select/epoll的单(大部分)线程操作 我正在考虑链接到lib_-uv,然后用C风格编程(或者围绕lib_-uv调用编写一些简洁的类),但这是最好的选择吗 我希望做的是: //伪代码 服务器; 侦听(地址、端口、回调); 无效回调(错误,套接字){ 如果(!错误){ socket.write(数据,另一个_回调); socket.bind.on_数据(数据_收到_回调); } else writeln(“连接失败”); } 正如Adam所说:是一个很棒
//伪代码
服务器;
侦听(地址、端口、回调);
无效回调(错误,套接字){
如果(!错误){
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
如果您只想进行异步编程,请查看
您可以在上浏览更多示例。是关于此主题的典型帖子。它有一个用光纤库包装的异步库,因此您可以线性调用它们的函数,并将其转换为异步,以避免太多的回调层。