WorkflowExtra

本项目为 C++ Workflow 的外传,用于探索新颖的辅助组件、奇特的使用方式等。本项目实现的接口可能随时被修改、移动、删除,功能可能随时修改含义,请知悉。

搬迁通知

我们的游乐场搬迁到coke啦,coke致力于以协程的方式使用Workflow,在协程模式下有更多有趣的内容值得探索。有趣的想法会优先在coke上实现,本项目或长期停更。

PipeRedisTask

Redis任务的pipeline模式,一次性向Redis发送多条命令,可以提高吞吐量。由于pipeline并不是事务,该客户端只是如实地将所有请求发出去,同时接收到所有回复,故一致性等问题不做保证。

示例 PipeRedisExample展示了使用方法,基本与WFRedisTask一致,只是拿到的结果一定是一个array,其长度应当与发送的请求数量一致,其中每个元素是对应请求的响应。

QpsPool

QpsPool用于限制每秒钟被发起的任务数量,即使同一时刻启动了多个任务,也会等待到合适的时机再执行。

示例 QpsPoolExample

WEQpsPool pool(10); // 最大Qps为10
WFFacilities::WaitGroup wg(100);

 // 同时发起100个任务
for (int i = 0; i < 100; i++) {
    auto *task = WFTaskFactory::create_go_task("", [&]() {
        wg.done();
    });
    // 将任务托管给QpsPool
    Workflow::start_series_work(pool.get(task), nullptr);
}

wg.wait();

Latch

Latch用于实现Series间的同步,将Latch::get创建的任务放置到Series的特定位置,当所有Series都执行到这个位置时,后续的任务才会被执行。使用Latch::get(false)指定该任务不进行等待,该任务仅通知到达事件,不会阻塞当前Series

示例 Latch

GoPipe

GoPipe是一个将一组GoTask串联起来的语法糖,支持串普通函数、可调用对象、lambda、std::function,前一个函数的返回值为后一个函数的参数,若前一个函数无返回值则后一个函数不可有参数。串联后的整个流程运行于同一个SeriesWork中,且运行时不可新增或移除任务,是一个编译时的静态流程,故目前有较大的局限性。

示例 GoPipe

wfextra::GoPipe<int>()
.then(&pool, func)
.then(double_to_string)
.then(Reverse{})
.then(&single, [](const string &y) {
    cout << "result: " << y << endl;
}).then(std::bind([](int i){ return i; }, 1))
.then([](int){})
.start(i + 1, [&wg]() { wg.done(); });

RefPtr

RefPtr是一个仅有引用计数功能的智能指针,适用于简单场景下仅需要引用计数但不想使用std::shared_ptr的情况。在不同线程操作不同RefPtr对象是安全的,即使他们引用同一个对象。

示例 RefPtr