我对未来和promise之间的区别感到困惑。
显然,他们有不同的方法和东西,但实际的用例是什么呢?
是吗?:
Future 和 Promise 是异步操作的两个独立方面。
std::promise
由异步操作的“生产者/写入者”使用。
std::future
由异步操作的“使用者/读取器”使用。
将它分成这两个独立的“接口”的原因是为了对“消费者/读者”隐藏“写/设置”功能。
auto promise = std::promise<std::string>();
auto producer = std::thread([&]
{
promise.set_value("Hello World");
});
auto future = promise.get_future();
auto consumer = std::thread([&]
{
std::cout << future.get();
});
producer.join();
consumer.join();
一种(不完整的)方法来实现std::a同步使用std::promise可能是:
template<typename F>
auto async(F&& func) -> std::future<decltype(func())>
{
typedef decltype(func()) result_type;
auto promise = std::promise<result_type>();
auto future = promise.get_future();
std::thread(std::bind([=](std::promise<result_type>& promise)
{
try
{
promise.set_value(func()); // Note: Will not work with std::promise<void>. Needs some meta-template programming which is out of scope for this question.
}
catch(...)
{
promise.set_exception(std::current_exception());
}
}, std::move(promise))).detach();
return std::move(future);
}
使用std::p ackaged_task
,它是一个帮助器(即它基本上做了我们上面正在做的事情),围绕std::p romise
,你可以做以下更完整,可能更快的事情:
template<typename F>
auto async(F&& func) -> std::future<decltype(func())>
{
auto task = std::packaged_task<decltype(func())()>(std::forward<F>(func));
auto future = task.get_future();
std::thread(std::move(task)).detach();
return std::move(future);
}
请注意,这与< code>std::async略有不同,在后者中,当析构时,返回的< code>std::future将实际阻塞,直到线程结束。
问题内容: 我尽力而为,但没有找到任何文章和博客可以清楚地比较和,并且提供了很好的分析。 因此,如果任何人都可以向我解释或指向这样的博客或文章,那对我来说真的非常好。 问题答案: 无论 ListenableFuture 和 CompletableFuture 有超过它的父类的优势 未来 通过允许呼叫者在这样或那样的回调“注册”当异步动作已经完成被调用。 使用 Future, 您可以执行以下操作:
我刚刚更新了Flutter,并成功地从下载了我的原始项目。现在我得到了一个奇怪的错误。我在github上看到有人提到它,但没有关于如何修复的明确答案。项目甚至不加载。它从我的main.dart文件中读取Future语句并返回此... [VERBOSE-2:dart\u error.cc(16)]未处理的异常:类型“Future dynamic”不是类型“Future String”的子类型,其中
我的服务代码如下所示, 在我的AKKA HTTP路由中,我尝试从返回的未来构建,如下所示, 我不确定如何提交给响应。被传递的未来实质上是一系列预期按顺序执行的平面映射的未来。但是,我不相信这会作为分块字节流返回到客户端。 然而,我只得到最后一个未来的结果如下, 亲切地问候Meeraj
我想不出比这更高的赞美。对我来说,这是一个软件开发者必须具备的两个最重要的素质。是的:必须,不是 应当。将 JavaScript 编程语言层层梳理,并将它们用易懂而且有意的部分表现出来,Kyle 的这种敏锐的能力无人能出其右。
刚刚开始探索reactor项目及其抽象、Mono和Flux,并希望了解与Java8 barebones CompletableFuture的基本区别。 下面是我的一个简单代码: 首先,并不奇怪。通过ForkJoinPool调度函数的执行,“end”行立即打印,程序终止,因为主线程在这里确实很短--正如预期的那样。 但是将主线程阻塞在那里。此外,在函数中打印的线程名是主线程。因此,我看到的是顺序/阻
在你一头扎进这本书之前,你应当可以熟练地使用(在本书写作时)最近版本的JavaScript,也就是通常所说的 ES5(技术上讲是ES 5.1)。这里,我们打算好好谈谈即将到来的 ES6,同时放眼未来去看看JS将会如何继续进化。 如果你还在JavaScript上寻找信心,我强烈推荐你首先读一读本系列的其他书目: 入门与进阶:你是编程和JS的新手吗?这就是你在开启学习的旅程前需要查看的路线图。 作用域