代码拉取完成,页面将自动刷新
众所周知,内存管理问题是C++异步编程里最难解决的问题。许多开发者也因此宁愿选择其他编程语言,以便把精力集中在业务逻辑上而不是繁琐的资源管理。当然也有人不断探索新的方法,简化C++内存管理,比较常用的例如shared_ptr以及RAII编程规范。
现在介绍一下我们的内存管理机制。其实就一句话:任务(以及series)的生命周期在其callback之后结束。任务里的数据,例如一个网络任务的resp,同样在callback之后就被内存回收了。如果需要保留,可以通过std::move()操作把数据移走。
这时可能有人要问,示例4中我们明明在process之后还操作了server task呀,process难道不是server任务的callback吗?确实不是,process是处理函数而不是callback。当然server任务也有callback,但默认是nullptr,调用时机是server回复完成。也就是说,无论是client任务还是server任务,callback都是网络交互的完成。这里再次体现了我们client与server的高度统一。
那么,我们简单修改一下示例4,再server回复完毕之后打印出回复是否成功:
#include <stdio.h>
#include "workflow/WFTaskFactory.h"
#include "workflow/WFHttpServer.h"
void callback(WFHttpTask *client_task)
{
protocol::HttpResponse *resp = client_task->get_resp();
const void *body;
size_t size;
// Http body received and http body for sending are different fields.
if (resp->get_parsed_body(&body, &size))
resp->append_output_body_nocopy(body, size);
SeriesWork *series = series_of(client_task);
WFHttpTask *server_task = (WFHttpTask *)series->get_context();
*server_task->get_resp() = std::move(*resp);
// Set a server task's callback
server_task->set_callback([](WFHttpTask *server_task) {
int state = server_task->get_state();
int error = server_task->get_error();
if (state == WFT_STATE_SUCCESS)
printf("Reply Success!\n");
else
printf("Reply failed! state = %d, error = %d.\n", state, error);
});
}
void process(WFHttpTask *server_task)
{
protocol::HttpRequest *req = server_task->get_req();
std::string url("https://gitee.com");
url = url + req->get_request_uri();
WFHttpTask *client_task = WFTaskFactory::create_http_task(url, 3, 2, callback);
*client_task->get_req() = std::move(*req);
client_task->get_req()->set_header_pair("Host", "gitee.com");
SeriesWork *series = series_of(server_task);
series->set_context(server_task);
series->push_back(client_task);
}
int main()
{
WFHttpServer server(process);
if (server.start(8888) == 0)
{
getchar();
server.stop();
}
return 0;
}
我们简单的给server任务设置一个lambda的callback,打印回复是否成功。当然,server回复成功指的就是把数据完全写入TCP buffer。因为一般来讲,http页面不会太大,所以几乎可以肯定不会失败。而在这个callback之后,server task的生命周期也就结束了。