continuable alternatives and similar libraries
Based on the "Concurrency" category.
Alternatively, view continuable alternatives based on common mentions on social networks and blogs.
-
Thrust
DISCONTINUED. [ARCHIVED] The C++ parallel algorithms library. See https://github.com/NVIDIA/cccl -
ck
Concurrency primitives, safe memory reclamation mechanisms and non-blocking (including lock-free) data structures designed to aid in the research, design and implementation of high performance concurrent systems developed in C99+. -
SPSCQueue.h
A bounded single-producer single-consumer wait-free and lock-free queue written in C++11 -
Bolt
Bolt is a C++ template library optimized for GPUs. Bolt provides high-performance library implementations for common algorithms such as scan, reduce, transform, and sort. -
CUB
DISCONTINUED. THIS REPOSITORY HAS MOVED TO github.com/nvidia/cub, WHICH IS AUTOMATICALLY MIRRORED HERE. -
Light Actor Framework
DISCONTINUED. Laughably simple yet effective Actor concurrency framework for C++20 -
BlockingCollection
C++11 thread safe, multi-producer, multi-consumer blocking queue, stack & priority queue class -
Easy Creation of GnuPlot Scripts from C++
A simple C++17 lib that helps you to quickly plot your data with GnuPlot
SaaSHub - Software Alternatives and Reviews
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of continuable or a related project?
README
Continuable is a C++14 library that provides full support for:
- lazy async continuation chaining based on callbacks (then) and expression templates, callbacks are wrapped nicely as promises.
- no enforced type-erasure which means we need less heap allocations than comparable libraries, strictly following the "don't pay for what you don't use" principle.
- support for all, any and sequential connections between continuables through expressive operator overloads &&, || and >> as well as free functions when_all, when_any and when_seq.
- asynchronous error handling through exceptions, error codes and user defined types.
- syntactic sugar for instance: partial invocation, tuple unpacking,
co_await
support and executors. - encapsuled from any runtime, larger framework or executors makes it possible to use continuable even in smaller or esoteric usage scenarios.
Getting started:
The documentation offers everything you need:
Issues and contributions
Issue reports and questions are accepted through the Github issue tracker as well as pull requests. Every contribution is welcome! Don't hesitate to ask for help if you need any support in improving the implementation or if you have any troubles in using the library
Quick Tour
- Create a continuable through
make_continuable
which returns a promise on invocation: ```cpp auto http_request(std::string url) { return cti::make_continuable<std::string>([url = std::move(url)](auto&& promise) { // Perform the actual request through a different library, // resolve the promise upon completion of the task. promise.set_value(" ... "); // or: promise.set_exception(std::make_exception_ptr(std::exception("Some error"))); // or: promise.set_canceled(); }); }
auto mysql_query(std::string query) { return cti::make_continuable([url = std::move(url)](auto&& promise) { // ^ multiple result types }); }
auto do_sth() { return cti::make_continuable([](auto&& promise) { // ^ no result at all }); }
auto run_it() { return async([] { // Directly start with a handler }); }
continuable<> run_it() { // With type erasure return async([] {
});
}
- **Attach your continuations through `then`, supports multiple results and partial handlers:**
```cpp
mysql_query("SELECT `id`, `name` FROM `users`")
.then([](result_set users) {
// Return the next continuable to process ...
return mysql_query("SELECT `id` name FROM `sessions`");
})
.then([](result_set sessions) {
// ... or pass multiple values to the next callback using tuples or pairs ...
return std::make_tuple(std::move(sessions), true);
})
.then([](result_set sessions, bool is_ok) {
// ... or pass a single value to the next callback ...
return 10;
})
.then([](auto value) {
// ^^^^ Templated callbacks are possible too
})
// ... you may even pass continuables to the `then` method directly:
.then(mysql_query("SELECT * `statistics`"))
.then([](result_set result) {
// ...
return "Hi";
})
.then([] /*(std::string result) */ { // Handlers can accept a partial set of arguments{
// ...
});
Handle failures through
fail
ornext
:http_request("example.com") .then([] { throw std::exception("Some error"); }) .fail([] (std::exception_ptr ptr) { if (ptr) { try { std::rethrow_exception(ptr); } catch(std::exception const& e) { // Handle the exception or error code here } } });
Dispatch continuations through a specific executor (possibly on a different thread or later)
auto executor = [](auto&& work) {
// Dispatch the work here, store it for later invocation or move it to another thread.
std::forward<decltype(work)>(work)();
};
read_file("entries.csv")
.then([](Buffer buffer) {
// ...
}, executor);
// ^^^^^^^^
- Connect continuables through
when_all
,when_any
orwhen_seq
: ``cpp //
all` of connections: (http_request("github.com") && http_request("example.com") && http_request("wikipedia.org")) .then([](std::string github, std::string example, std::string wikipedia) { // The callback is called with the response of github, // example and wikipedia. });
// any
of connections:
(http_request("github.com") || http_request("example.com") || http_request("wikipedia.org"))
.then([](std::string github_or_example_or_wikipedia) {
// The callback is called with the first response of either github,
// example or wikipedia.
});
// sequence
of connections:
(http_request("github.com") >> http_request("example.com") >> http_request("wikipedia.org"))
.then([](std::string github, std::string example, std::string wikipedia) {
// The requests are invoked sequentially
});
// Mixed logical connections: (http_request("github.com") && (http_request("example.com") || http_request("wikipedia.org"))) .then([](std::string github, std::string example_or_wikipedia) { // The callback is called with the response of github for sure // and the second parameter represents the response of example or wikipedia. });
// There are helper functions for connecting continuables: auto all = cti::when_all(http_request("github.com"), http_request("example.com")); auto any = cti::when_any(http_request("github.com"), http_request("example.com")); auto seq = cti::when_seq(http_request("github.com"), http_request("example.com"));
- **Deal with multiple result variables through `result` and `recover` from failures:**
```cpp
make_exceptional_continuable<void>(std::make_exception_ptr(std::exception("Some error"))
.fail([] (std::exception_ptr ptr) {
return recover();
})
.then([] () -> result<> {
// We recovered from the failure and proceeding normally
// Will yield a default constructed exception type to signal cancellation
return cancel();
});
promisify
your existing code or use the (asio) completion token integration: ```cpp // Promisification of your existing code that accepts callbacks auto async_resolve(std::string host, std::string service) { return cti::promisify<asio::ip::udp::resolver::iterator>::from( [&](auto&&... args) { resolver_.async_resolve(std::forward(args)...); }, std::move(host), std::move(service)); }
// (boost) asio completion token integration asio::io_context io_context; asio::steady_timer steady_timer(io_context);
steady_timer.expires_after(std::chrono::seconds(5)); steady_timer.async_wait(cti::use_continuable) .then([] { // Is called after 5s });
- **C++20 Coroutine support:**
(`co_await` and `co_return`) are supported by continuable when the underlying toolchain supports the TS. Currently this works in MSVC 2017 and Clang 5.0. You have to enable this capability through the `CTI_CONTINUABLE_WITH_AWAIT` define in CMake:
```cpp
int i = co_await cti::make_continuable<int>([](auto&& promise) {
promise.set_value(0);
});
Appearances:
MeetingC++ 2018 Talk |
---|
] |
.
*Note that all licence references and agreements mentioned in the continuable README section above
are relevant to that project's source code only.