134 Star 1.1K Fork 345

GVP搜狗开源 / workflow

 / 详情

WF编程小示例5: 任务的生命周期与server任务callback

待办的
成员
创建于  
2021-07-11 16:36

众所周知,内存管理问题是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的生命周期也就结束了。

评论 (0)

xiehan 创建了任务
xiehan 关联仓库设置为搜狗开源/workflow
xiehan 修改了描述
展开全部操作日志

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(1)
C++
1
https://gitee.com/sogou/workflow.git
git@gitee.com:sogou/workflow.git
sogou
workflow
workflow

搜索帮助

14c37bed 8189591 565d56ea 8189591