问题标签 [boost-coroutine]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
68 浏览

c++ - 这个匹配算法是哪个协程库?

我想知道哪个协程库适合实现以下算法,它是符号表达式的交换模式加工问题的简化模型(C ++开源计算机代数系统中解决)。一般来说,假设需要堆栈协程是否正确?协程之外是否有 C++ 替代方案?

给定两棵任意长度的树(或 DAG),包含三种类型的节点,黑色/红色和任意数量的子节点;黑色节点的子节点顺序固定,相反红色节点的子节点顺序无关紧要;和叶子。查找两棵树是否匹配的算法由于红色节点的交换性质以及没有规范顺序的事实而变得非常复杂,因此您不能简单地对节点的所有子节点进行排序。例子:

使用类层次结构和递归调用match()匹配节点本身和每个子节点的虚拟成员函数可以轻松实现标准(非交换)情况。在这里,leaf1发现Leaf2不同的是,递归调用返回False。如果红色是可交换的,那么在红色节点上,算法 1. 需要遍历其节点的所有排列,以及 2.,如果对红色的调用match()成功,则需要暂停排列循环,因为调用者可能会发生失败,需要不同的匹配。将状态存储在调用者中是不够的,因为被调用者本身可能已经调用了自己match()并且也需要重新启动,否则会错过可能的解决方案。

在函数式语言中,yield递归调用可以解决问题。例如,matchpy 包有一个 Python 实现。这似乎是一个协程任务,但您会使用哪个库?boost::coroutine只有一个适合这个吗?C++20 会给我们带来这个功能吗?clang 已经可以做到这一点了吗?

0 投票
1 回答
768 浏览

c++ - ASIO - 如何停止简单的基于协程的服务器?

我有以下简单的基于协程的服务器:

我想在一个线程上运行这个服务器并在主程序即将完成时干净地停止它:

不幸的是,如果有一个连接的套接字,当我调用Stop一个异常时boost::coroutines::detail::forced_unwind就会抛出一个异常。

我也尝试过在停止之前创建一个显式strand并分派一个,结果相同。Socket.close()

这种方法有问题吗?

0 投票
1 回答
802 浏览

c++ - 我可以在不重叠的情况下将多个协程生成到同一条链上吗?

我试图调用boost::asio::spawn相同的两次boost::asio::io_context::strand,每次都传递一个协程,我希望这两个协程一个接一个地执行,但它们是并行执行的。这是说明这一点的代码:

这输出:

当我期待:

在实际代码中,第一个协程设置一个套接字(通过解析/连接/握手的动作),第二个协程进行发送/接收。我的意图是将第二个协程“附加”到链中,并且只有在第一个协程完成时才开始执行。

我怎样才能达到这个效果?

编辑:更多上下文。第一个协程在构造函数中,第二个在成员函数中。如果我想允许用户写

如何确保构造函数中的协程在 bar() 中的协程开始之前完成?

0 投票
0 回答
423 浏览

c++ - void boost::coroutines::detail::push_coroutine_impl::push(): 断言`! is_running()' 失败

主题

这个 POC 应用程序使用 Boost ASIO 和协程来服务 HTTP 请求。一旦请求被完全读取,连接处理程序会将实际的请求处理外包到一个单独的线程池中,用于 CPU 绑定的操作,并且连接处理程序协程会暂停。一旦响应完成,该协程就会恢复发送它。

问题

在使用应用程序进行测试时,wrk -d 30 -c 100 -t 100 http://127.0.0.1:8910/迟早会失败:

我的问题

  1. 应用程序的概念(带有协程的 ASIO 线程池 + 带有队列的 CPU 绑定线程池)是否可能/现实?
  2. 如果是:在暂停/恢复协程时我到底做错了什么?我不应该使用async_completion,completion_handler并且asio_handler_invoke像 boost 库本身一样吗?

代码

AFAIK 我应该发布应用程序的代码——所以在这里......我希望有 223 行并不重要。

IMO 的重要线路是 160、193-198、92-102 和 106-109。

编辑#1:回溯

编辑#2

看来我的错误之一是work_queue#async_run()必须是:

但这并没有解决问题。

0 投票
1 回答
1751 浏览

c++ - Boost ASIO 和 co_await - 与任何第三方回调一起使用?

一个简单的功能:

可以等待使用co_await write(my_data)

这在我使用任何异步 Boost ASIO 功能时有效。

如果异步函数是来自某个不相关库的回调,人们将如何使用这种模式?

该代码可能看起来像:

用法类似于auto result = co_await foo().

我很难弄清楚最简单/最干净的方法是什么。

附赠问题:Boost ASIO 的协程 API(例如令牌)、Boost 的协程库和 Coroutines TS 之间有什么关系?

0 投票
0 回答
628 浏览

c++ - boost协程的堆栈大小是多少?

boost::coroutine2 需要的最佳堆栈大小是多少?我们是否需要将其与线程堆栈大小相匹配?(https://www.boost.org/doc/libs/1_68_0/libs/context/doc/html/context/stack.html

0 投票
1 回答
81 浏览

boost - 有没有办法通过协程获取Boost asio中传输的字节数

我正在使用带有协程的 boost asio 从 tcp 套接字获取一些数据。在这些文档中显示的示例中,示例看起来像

但是在这种情况下如何获得传输的字节数。

在不使用协程的情况下,我们可以绑定一个回调函数。

但目前还不是很清楚如何用协程做同样的事情。

0 投票
1 回答
363 浏览

c++ - 将 Boost.Coroutine 与 Boost.ASIO 一起使用会导致断言

我有 boost::asio::io_context,它在多个线程中运行(通过 ctx.run()),并且我有几个在 boost.coroutines 中使用的异步对象,它们通过 boost::asio::spawn 运行。我有以下断言:

我提供了一个导致相同错误的最小示例。请帮助我:我做错了什么?

升压版本是 1.68

[更新]:代码中有一个修复(忘记锁定 io_context),但无论如何它不会影响断言。

0 投票
1 回答
199 浏览

boost - 将数据写入客户端时提升协程服务器崩溃

我基于 boost coroutine echo server example 制作了我的服务器,只是接收和写回一些数据。它在向客户端写入数据时崩溃,更奇怪的是,它只在使用多核时崩溃。

这是服务器,它读取 4 个字节并在 1 秒内写回“OK”作为超时:

请注意,4 字节数据包1 秒超时只是为了说明问题,真实服务器使用大数据包可能会在网络状况不佳时导致超时。为了模拟这一点,客户端每秒写入 1 个字节以触发服务器上的读取超时。

客户端:

问题一

为什么这条线会导致崩溃?

boost::asio::async_write(socket_, boost::asio::buffer(string(reason)), yield[ecw]);

问题 2

为什么服务器在 1 cpu 上运行时不会崩溃:io_context.run();
并在多个 CPU 上使用thread_group?

我的环境:Win10-64bit、boost-1.71.0-64bit、VisualStudio-2017-Community

0 投票
1 回答
632 浏览

c++ - Boost 协程是否比 Boost.Asio 的异步操作更快?或者在什么情况下协程可以更快?

就我而言,我有一台服务器可以处理大量的 sip 呼叫(同时处理 3000 个)。它发送和接收 SIP 数据包和大量 RTP 数据包(每 20 毫秒一个数据包)。

现在一切都通过 Boost.Asio 与回调异步工作。

我现在面临一个优化问题。已经做了一些事情来让它工作得更快(例如从动态分配过渡到池分配,改变获取时间的方法等),但加速是适度的。

函数分析器在顶部显示了大量的 mutex_lock,所以我认为这与所有这些异步调用有关。浏览网页时,我发现协程可以替代回调。据我了解,它们使代码看起来更有吸引力和简单,同时仍然保持异步性质。

但是它的性能呢?协程会比异步调用和回调更快(至少在我的情况下)?

这是分析器的屏幕截图: Profiler output