zoukankan      html  css  js  c++  java
  • 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
    ", strerror(error));
                break;
            case WFT_STATE_DNS_ERROR:
                fprintf(stderr, "DNS error: %s
    ", gai_strerror(error));
                break;
            case WFT_STATE_SSL_ERROR:
                fprintf(stderr, "SSL error: %d
    ", error);
                break;
            case WFT_STATE_TASK_ERROR:
                fprintf(stderr, "Task error: %d
    ", error);
                break;
            case WFT_STATE_SUCCESS:
                resp->get_result(val);
                if (val.is_error()) {
                    fprintf(stderr, "Error reply. Need a password?
    ");
                    state = WFT_STATE_TASK_ERROR;
                }
                break;
            default:
                break;
        }
    
        if (state != WFT_STATE_SUCCESS) {
            fprintf(stderr, "Failed. Press Ctrl-C to exit.
    ");
            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...
    ");
        } else {
            if (val.is_string()) {
                fprintf(stderr, "Redis GET success. value = %s
    ",
                        val.string_value().c_str());
            } else {
                fprintf(stderr, "Error: Not a string value. 
    ");
            }
    
            fprintf(stderr, "Finished. Press Ctrl-C to exit.
    ");
        }
    
    }
    
    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上就是粉色的。

  • 相关阅读:
    zoj 3591 Nim 博弈论
    zoj 3529 A Game Between Alice and Bob 博弈论
    zoj 3513 Human or Pig 博弈论
    hdu 3886 Final Kichiku “Lanlanshu” 数位DP
    2013 ACM/ICPC Asia Regional Changsha Online
    2013 ACM/ICPC Asia Regional Changsha Online G Goldbach
    hdu 4753 Fishhead’s Little Game 博弈论+记忆化搜索
    hdu 1404/zoj 2725 Digital Deletions 博弈论
    zoj 2686 Cycle Game 博弈论
    zoj 2290 Game 博弈论
  • 原文地址:https://www.cnblogs.com/Addoil/p/13956163.html
Copyright © 2011-2022 走看看