Awacorn 是一个 C++ 11 的有栈协程/调度实现,总体偏向 Javascript。
int main() {
awacorn::event_loop ev;
awacorn::async(
[&](awacorn::context& ctx) {
std::cout << "Hello World. Input your name" << std::endl;
std::string name = ctx >> async_input(&ev, "Your name: ");
std::cout << "Welcome, " << name << "!" << std::endl;
});
ev.start();
}
👀 查看 完整示例
Awacorn 是一个异步编程库,包含以下内容:
- 事件循环
- 类 Javascript
Promise
- 有栈协程
📝 更详细的信息请跳转至 文档。
Awacorn 和通常的 C++ 协程有什么区别?
表现为以下形式:
- Awacorn 的协程不和调度器绑定。
- ✌️ 你可以将
promise
和async
单独拿出来使用,他们并不依赖event
。
- ✌️ 你可以将
- Awacorn 是基于
await
/async
的。- ❌ 一般的协程库会 劫持 你的函数调用,这样你就感觉不到你在用协程。比如 libgo 或者 libco。缺点就是 channel 泛滥,非常难看。
- ✅ Awacorn 基于
await
/async
模式,且不劫持任何系统调用。你可以自己实现异步接口。
- Awacorn 活用了 C++ 11 的元编程特性,以及智能指针。
- 🔍 参见
promise
及async
的返回值及await
处理。
- 🔍 参见
以下是 Awacorn 支持的编译选项。
选项 | 描述 | 要求 |
---|---|---|
-DAWACORN_BUILD_EXAMPLE | 💚 构建所有示例程序和测试,这将导致额外的编译时间。 | N/A |
-DAWACORN_USE_BOOST | 🚧 使用 boost::context::continuation 作为协程实现。 |
boost_context |
-DAWACORN_USE_UCONTEXT | 🚧 使用 ucontext_t 作为协程实现。 |
ucontext.h (libucontext) |
💡 提示: 当 -DAWACORN_USE_BOOST
和 -DAWACORN_USE_UCONTEXT
均未被指定时,awacorn 将自动指定最优实现。
boost
和 ucontext
均无法使用时,编译将失败。请安装 libucontext
或 libboost
。
- boost::context:
- 🐧 Debian:
apt install libboost-context-dev
- 📱 Termux:
apt install boost-headers
- 🐧 Debian:
- libucontext:
- ✅ 几乎所有
i386/x86_64
Linux 发行版都包含ucontext
支持。 - 📱 Termux:
apt install libucontext
- ✅ 几乎所有
以下是 Awacorn 的组件大览。
组件名 | 描述 | 依赖 | 文档 |
---|---|---|---|
event |
Awacorn 的事件循环,负责调度定时事件。 | void | 🐯 event |
promise |
类似于 Javascript 的 Promise,低成本 & 强类型。 | void | 🐺 promise |
async |
async/await 有栈协程。 |
(boost | ucontext ) & promise |
🐱 async |
function |
Awacorn 采用的内部 std::function 实现。 |
void | 🐻 function |
capture |
Awacorn 采用的内部万能捕获实现。 | void | 🐂 capture |
experimental/async |
Awacorn 最新的无栈协程。 | void | 🐱 experimental/async |
🔰 点击 文档 即可查看组件相关的 详细文档。
Awacorn version 3.1.0.
This program was under the MIT license.