mirror of
https://github.com/sogou/workflow.git
synced 2026-10-17 04:31:07 +08:00
Update tutorial-09-http_file_server.md
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
|
||||
http_file_server是一个web服务器,用户指定启动端口,根路径(默认为程序当路程),就可以启动一个web server。
|
||||
用户还可以指定一个PEM格式的certificate file和key file,启动一个https web server。
|
||||
程序在启动server之后,可以从命令行接受用户输入,并通过127.0.0.1地址来访问这个server。
|
||||
程序主要展示了磁盘IO任务的用法。在Linux系统下,我们利用了Linux底层的aio接口,文件读取完全异步。
|
||||
|
||||
# 启动server
|
||||
@@ -141,6 +142,53 @@ buf域的内存我们是自己管理的,可以通过append_output_body_nocopy(
|
||||
在回复完成后,我们会free()这块内存,这个语句在process里:
|
||||
server_task->set_callback([](WFHttpTask *t){ free(t->user_data); });
|
||||
|
||||
# 命令行交互
|
||||
|
||||
启动server后,用户可以在控制台输入文件名来访问server。当输入文件名为空(Ctrl-D),关闭server并结束程序。
|
||||
这里,我们使用了WFRepeaterTask来实现这个循环接受输入的过程。WFRepeaterTask是一种循环任务,产生的接口如下:
|
||||
~~~cpp
|
||||
using repeated_create_t = std::function<SubTask *(WFRepeaterTask *)>;
|
||||
using repeater_callback_t = std::function<void (WFRpeaterTask *)>;
|
||||
|
||||
class WFTaskFactory
|
||||
{
|
||||
WFRpeaterTask *create_repeater_task(repeated_create_t create, repeater_callback_t callback);
|
||||
};
|
||||
~~~
|
||||
通过create函数,可以创建一个repeater任务。repeater内部会反复调用create,产生一个任务并运行,直到create返回空指针。
|
||||
在我们的这个示例里,create函数内部调用scanf。当用户输入为空时,create返回NULL,整个循环过程结束。
|
||||
当用户输入不为空(文件名),产生一个访问127.0.0.1地址的http任务来访问我们开启的server。
|
||||
~~~cpp
|
||||
{
|
||||
auto&& create = [&scheme, port](WFRepeaterTask *)->SubTask *{
|
||||
...
|
||||
scanf("%1023s", buf);
|
||||
if (*buf == '\0')
|
||||
return NULL;
|
||||
|
||||
std::string url = scheme + "127.0.0.1:" + std::to_string(port) + "/" + buf;
|
||||
WFHttpTask *task = WFTaskFactory::create_http_task(url, 0, 0,
|
||||
[](WFHttpTask *task) {
|
||||
...
|
||||
});
|
||||
|
||||
return task;
|
||||
};
|
||||
|
||||
WFFacilities::WaitGroup wg(1);
|
||||
WFRepeaterTask *repeater;
|
||||
repeater = WFTaskFactory::create_repeater_task(create, [&wg](WFRepeaterTask *) {
|
||||
wg.done();
|
||||
});
|
||||
|
||||
repeater->start();
|
||||
wg.wait();
|
||||
|
||||
server.stop();
|
||||
}
|
||||
~~~
|
||||
最后,当create返回NULL,repeater被callback。我们关闭server并结束程序。
|
||||
|
||||
# 关于文件异步IO的实现
|
||||
|
||||
Linux操作系统支持一套效率很高,CPU占用非常少的异步IO系统调用。在Linux系统下使用我们的框架将默认使用这套接口。
|
||||
|
||||
Reference in New Issue
Block a user