当前位置: 首页 > 知识库问答 >
问题:

未来与promise

许淳
2023-03-14

我对未来和promise之间的区别感到困惑。

显然,他们有不同的方法和东西,但实际的用例是什么呢?

是吗?:

  • 当我管理一些异步任务时,我使用future来获取值“in future”
  • 当我执行异步任务时,我使用promise作为返回类型,以允许用户从我的promise中获得未来

共有1个答案

苏俊友
2023-03-14

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的新手吗?这就是你在开启学习的旅程前需要查看的路线图。 作用域