Sogou C++ Workflow 安裝與使用例子


簡介:

搜狗公司C++服務器引擎,支撐搜狗幾乎所有后端C++在線服務,包括所有搜索服務,雲輸入法,在線廣告等,每日處理超百億請求。這是一個設計輕盈優雅的企業級程序引擎,可以滿足大多數C++后端開發需求。

 

使用:

 

第一步:

確保機器上有c++環境,安裝的有gcc,cmake,CLion(非必須,但是有了會很舒服)。

 

第二步:

下載源碼安裝,安裝位置是 /usr/local/include/workflow 目錄下

git clone https://github.com/sogou/workflow.git

cd workflow

mkdir  build

cd build

cmake ..

make && make install

 

然后一個簡單使用redis的例子,使用CLion創建一個c++14的工程

 

怎么安裝 redis

sudo apt install  redis-server

 

創建這樣的目錄

 

 

cmake 這么寫

cmake_minimum_required(VERSION 3.17)
project(study)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_COMPILER g++)
set(
        SOURCES
        src/redis_cli.cpp
        src/main.cpp
)

add_executable(${PROJECT_NAME} ${SOURCES})
target_include_directories(${PROJECT_NAME}
        PUBLIC  ${PROJECT_SOURCE_DIR}/include)
#target_link_libraries(${PROJECT_NAME} pthread )
target_link_libraries(study workflow) #關鍵,如果不加會報錯,編譯的時候找不到函數

下面可以愉快的寫代碼了

redis_cli.h

//
// Created by ct on 2020/11/10.
//

#ifndef STUDY_REDIS_CLI_H
#define STUDY_REDIS_CLI_H

#include <netdb.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>

#include "workflow/RedisMessage.h"
#include <workflow/WFTaskFactory.h>
#include <workflow/WFFacilities.h>

namespace redis_cli {

    const static int RETRY_MAX=2;

    // 配合例子數據結構體
    struct tutorial_task_data {
        std::string url;
        std::string key;
    };
    // 處理請求結果
    void redis_callback(WFRedisTask *task);

    static WFFacilities::WaitGroup wait_group(1);

    void sig_handler(int signo);

    int run();
}


#endif //STUDY_REDIS_CLI_H

 

redis_cli.cpp

 

//
// Created by ct on 2020/11/10.
//

#include <iostream>
#include "redis_cli.h"

void redis_cli::redis_callback(WFRedisTask *task) {
    protocol::RedisRequest *req = task->get_req();
    protocol::RedisResponse *resp = task->get_resp();
    int state = task->get_state();
    int error = task->get_error();
    protocol::RedisValue val;
    switch (state) {
        case WFT_STATE_SYS_ERROR:
            fprintf(stderr, "system error: %s\n", strerror(error));
            break;
        case WFT_STATE_DNS_ERROR:
            fprintf(stderr, "DNS error: %s\n", gai_strerror(error));
            break;
        case WFT_STATE_SSL_ERROR:
            fprintf(stderr, "SSL error: %d\n", error);
            break;
        case WFT_STATE_TASK_ERROR:
            fprintf(stderr, "Task error: %d\n", error);
            break;
        case WFT_STATE_SUCCESS:
            resp->get_result(val);
            if (val.is_error()) {
                fprintf(stderr, "Error reply. Need a password?\n");
                state = WFT_STATE_TASK_ERROR;
            }
            break;
        default:
            break;
    }

    if (state != WFT_STATE_SUCCESS) {
        fprintf(stderr, "Failed. Press Ctrl-C to exit.\n");
        return;
    }

    std::string cmd;
    req->get_command(cmd);
    std::cout << " cmd --- :" << cmd << std::endl;
    if (cmd == "SET") {
        auto *data = (tutorial_task_data *) task->user_data;
        WFRedisTask *next = WFTaskFactory::create_redis_task(data->url,
                                                             RETRY_MAX,
                                                             redis_cli::redis_callback);
        next->get_req()->set_request("GET", {data->key});
        // 將下一個任務(GET task)推送到當前序列。
        series_of(task)->push_back(next);
        fprintf(stderr, "Redis SET request success. Trying to GET...\n");
    } else {
        if (val.is_string()) {
            fprintf(stderr, "Redis GET success. value = %s\n",
                    val.string_value().c_str());
        } else {
            fprintf(stderr, "Error: Not a string value. \n");
        }

        fprintf(stderr, "Finished. Press Ctrl-C to exit.\n");
    }

}

void redis_cli::sig_handler(int signo) {
    redis_cli::wait_group.done();
}

int redis_cli::run() {
    //  WFRedisTask *task;
    auto url = "redis://127.0.0.1";
    std::cout << url << std::endl;
    WFRedisTask *task = WFTaskFactory::create_redis_task(url, RETRY_MAX, [](WFRedisTask *task) { // 可以在這callblack里獲取和執行一些代碼
        std::string cmd;   
        task->get_req()->get_command(cmd);
        std::cout << cmd << std::endl;
        std::vector<std::string> v;
        task->get_req()->get_params(v);
        for( auto str : v ){
            std::cout<< str << std::endl;
        }
    });
    task->get_req()->set_request("SET", {"c++", "Hello World!"}); // 這里就是對Redis的簡單使用,類似於對task這個對象執行set方法
    //task->user_data = &data;
    task->start();// 執行這個任務

    WFRedisTask *task2 = WFTaskFactory::create_redis_task(url, RETRY_MAX, [](WFRedisTask *task) {
        std::string cmd;
        task->get_req()->get_command(cmd);
        std::cout << cmd << std::endl;
        protocol::RedisValue val;
        task->get_resp()->get_result(val);
        std::cout<<"Value: "<< val.string_value() << std::endl;
    });
    task2->get_req()->set_request("GET",{"c++"});
    task2->start();
    wait_group.wait();
    return 0;
}

 

 

main.cpp 是不是很喜歡這個主題啊,插件名字叫 Xcode-Dark Theme,粉色的關鍵字,很符合c++的氣質,畢竟github上就是粉色的。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM