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上就是粉色的。