Skip to content

如何使用Cinatra的执行器执行异步函数? #747

Description

@CsVeryLoveXieWenLi

如题

我需要进行类定时器的任务,可是,如果我自行开辟协程或线程,无法与Cinatra耦合
我当然知道正常人都是多线程多协程,可是我目前希望单线程多协程,这样不用加锁
现在的问题是,我无法提交至用于处理网络请求的执行器中执行异步函数,另起炉灶,会导致线程竞争

多线程没有这个问题,本身就要加锁防止线程竞争,但是单线程会有这个问题
可能可以直接初始化请求一次,然后得到执行器,初始化,这样就行了,但是这样很不优雅

#include "cinatra/coro_http_server.hpp"
#include <cinatra.hpp>
#include <iostream>
#include <thread>

using namespace cinatra;
using namespace async_simple::coro;

int main() {
    // 1. http_server (即 coro_http_server) 默认构造,不能传线程数
    coro_http_server server(1, 8080);

    // 3. 获取真正的全局 executor 并提交任务打印线程 ID
    auto* global_executor = coro_io::get_global_executor();
    if (global_executor) {
        global_executor->schedule([]() { std::cout << "[coro_io Global Executor Thread ID]: " << std::this_thread::get_id() << std::endl; });
    }

    // 4. 新版路由注册接口是 set_http_handler,不是 register_handler
    // 必须返回 async_simple::coro::Lazy<void>
    server.set_http_handler<GET>("/check_thread", [](request& req, response& res) -> Lazy<void> {
        std::cout << "[HTTP Router Thread ID]: " << std::this_thread::get_id() << std::endl;

        res.set_status_and_content(status_type::ok, "Check console for thread IDs.");
        co_return;
    });

    // 5. 绑定端口并启动
    server.async_start();

    return 0;
}
[root@DESKTOP-9BUM11M release]# ./4ascend-online
[coro_io Global Executor Thread ID]: 137600198044464
[HTTP Router Thread ID]: 137600197327664
[HTTP Router Thread ID]: 137600197327664
[HTTP Router Thread ID]: 137600197327664
[HTTP Router Thread ID]: 137600197327664
[HTTP Router Thread ID]: 137600197327664
[HTTP Router Thread ID]: 137600197327664
[HTTP Router Thread ID]: 137600197327664
[HTTP Router Thread ID]: 137600197327664
[HTTP Router Thread ID]: 137600197327664
[HTTP Router Thread ID]: 137600197327664
[HTTP Router Thread ID]: 137600197327664
[HTTP Router Thread ID]: 137600197327664
[HTTP Router Thread ID]: 137600197327664
[HTTP Router Thread ID]: 137600197327664

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions