From 8aac91872d8579adfb62b43e2366c76e0afdb90d Mon Sep 17 00:00:00 2001 From: wyc <1104749580@qq.com> Date: Mon, 29 Jun 2026 10:01:33 +0800 Subject: [PATCH] =?UTF-8?q?asio=E5=A4=9A=E7=BA=BF=E7=A8=8B=E5=A4=84?= =?UTF-8?q?=E7=90=86=E6=95=B0=E6=8D=AE=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/Local_Server/server/io_coro.cpp | 7 +++---- module/Local_Server/server/io_coro.h | 7 +++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/module/Local_Server/server/io_coro.cpp b/module/Local_Server/server/io_coro.cpp index ed628ee..b7b3c5b 100644 --- a/module/Local_Server/server/io_coro.cpp +++ b/module/Local_Server/server/io_coro.cpp @@ -121,7 +121,6 @@ bool data_feed_debug = false; asio::awaitable Data_Feed::loop_coro() { auto feed = this; auto co = Coro::instance(); - co_await asio::post(co->io, asio::use_awaitable); auto& mode_acs = Global::instance()->mode_acs; auto& cfg = mode_acs.data_feed_config; auto& pool = cfg.pool_; @@ -177,7 +176,7 @@ asio::awaitable Data_Feed::loop_coro() { std::cout << std::format("{} after send {}\n", key, thread_id_str()); } } - co_await asio::post(co->io, asio::use_awaitable); + co_await resume_on(co->io.get_executor()); } std::cout << std::format("{} feed loop exit {}\n", key, thread_id_str()); co_return; @@ -186,7 +185,6 @@ bool data_source_debug = false; asio::awaitable Data_Source::loop_coro() { auto source = this; auto co = Coro::instance(); - co_await asio::post(co->io, asio::use_awaitable); while (source->running()) { if (data_source_debug) { std::cout << std::format("{} source loop begin {}\n", key, thread_id_str()); @@ -208,11 +206,12 @@ asio::awaitable Data_Source::loop_coro() { if (!enable || !source->running() || !source->registered()) { break; } - co_await asio::post(*co->process_data, asio::use_awaitable); + co_await resume_on(co->process_data->get_executor()); if (data_source_debug) { std::cout << std::format("{} before process {}\n", key, thread_id_str()); } auto num = source->process_mode_acs_data(mode_data); + co_await resume_on(co->io.get_executor()); if (data_source_debug) { std::cout << std::format("{} after process {} {}\n", key, num, thread_id_str()); } diff --git a/module/Local_Server/server/io_coro.h b/module/Local_Server/server/io_coro.h index 9d9ad5a..30082de 100644 --- a/module/Local_Server/server/io_coro.h +++ b/module/Local_Server/server/io_coro.h @@ -11,6 +11,7 @@ #include #include #include +#include "asio/bind_executor.hpp" #include "psc_global_include/Singleton.hpp" class Coro : public Psc::Singleton { public: @@ -32,3 +33,9 @@ private: std::unique_ptr> data_feed_thread_task; std::atomic running = false; }; +inline asio::awaitable resume_on(asio::any_io_executor ex) { + co_await asio::post(asio::bind_executor(ex, asio::deferred)); +} +inline asio::awaitable dispatch_on(asio::any_io_executor ex) { + co_await asio::dispatch(asio::bind_executor(ex, asio::deferred)); +}