如何让协程始终在同一个线程中工作?
How do I make the coroutine always work in the same thread?
我想接受线程 0 中的连接,然后 post 此套接字到其他线程之一 (1 - 31) 用于负载平衡 ,然后我希望所有其他与此套接字的操作都将在同一个线程中,通过使用协程 - 避免线程间上下文切换g.
我想通过io_service
+work
+vector<boost::thread>
.
[=在不同线程上执行异步回调以实现负载平衡42=]
但同时我想通过仅在同一线程内使用协程来执行此套接字的所有其他操作 - 没有负载平衡和快速上下文切换。
如果我通过boost::asio::spawn()
使用boost.coroutine1,那么协程可以在不同的线程上交替执行吗?
如果可以,那么如何使协同程序的回调始终在调用异步操作的同一线程中执行,即使 io_service
绑定了许多线程(线程-池)?
for (size_t i = 0; i < thread_num_executors; ++i)
thr_grp_executors.emplace_back(
boost::bind(&boost::asio::io_service::run, &io_service));
众所周知,协程之间的切换非常快,在 x86_64 上大约需要 10-12 ns: http://www.boost.org/doc/libs/1_64_0/libs/coroutine/doc/html/coroutine/performance.html
但这只有在协程切换发生在单个线程内时才成立。因为线程切换花费了 超过 100 ns。
那如何让协程一直在同一个线程中工作呢?
如果io_service绑定了很多线程,就没有办法让作品出现在同一个"physical thread"上(所以,逻辑核心)。
除此之外,您可以通过在一条链上生成 coro 来控制 "logical threads"。
如果您必须具有线程亲和性,我认为没有比在单个线程上 运行 和 io_service 更好的方法了,也许可以复制每个线程的 io_service相反。
所有这些都可能会随着更通用的 Executors 提案而得到改进,我相信 Chris Kohlhoff 在他的 github 上有一个预览回购。不妨看看
我想接受线程 0 中的连接,然后 post 此套接字到其他线程之一 (1 - 31) 用于负载平衡 ,然后我希望所有其他与此套接字的操作都将在同一个线程中,通过使用协程 - 避免线程间上下文切换g.
我想通过
[=在不同线程上执行异步回调以实现负载平衡42=]io_service
+work
+vector<boost::thread>
.但同时我想通过仅在同一线程内使用协程来执行此套接字的所有其他操作 - 没有负载平衡和快速上下文切换。
如果我通过boost::asio::spawn()
使用boost.coroutine1,那么协程可以在不同的线程上交替执行吗?
如果可以,那么如何使协同程序的回调始终在调用异步操作的同一线程中执行,即使 io_service
绑定了许多线程(线程-池)?
for (size_t i = 0; i < thread_num_executors; ++i)
thr_grp_executors.emplace_back(
boost::bind(&boost::asio::io_service::run, &io_service));
众所周知,协程之间的切换非常快,在 x86_64 上大约需要 10-12 ns: http://www.boost.org/doc/libs/1_64_0/libs/coroutine/doc/html/coroutine/performance.html
但这只有在协程切换发生在单个线程内时才成立。因为线程切换花费了 超过 100 ns。
那如何让协程一直在同一个线程中工作呢?
如果io_service绑定了很多线程,就没有办法让作品出现在同一个"physical thread"上(所以,逻辑核心)。
除此之外,您可以通过在一条链上生成 coro 来控制 "logical threads"。
如果您必须具有线程亲和性,我认为没有比在单个线程上 运行 和 io_service 更好的方法了,也许可以复制每个线程的 io_service相反。
所有这些都可能会随着更通用的 Executors 提案而得到改进,我相信 Chris Kohlhoff 在他的 github 上有一个预览回购。不妨看看