【问题标题】:Using `concurrent.futures.Future` as promise使用 `concurrent.futures.Future` 作为承诺
【发布时间】:2015-01-06 11:41:16
【问题描述】:

在 Python docs 我看到了:

concurrent.futures.Future... ...不应该直接创建 测试除外。

我想在我的代码中使用它作为一个承诺,我很惊讶不建议这样使用它。

我的用例:
我有一个 single 线程来读取来自套接字的数据包,并且我有 许多 回调,这些回调取决于数据包中包含的某些信息。数据包是对消费者请求的响应,所有消费者使用单一连接。每个消费者都会收到一个 Promise 并向其添加一些处理程序,这些处理程序会在响应到达时被调用。

所以我不能在这里使用Executor 子类,因为我只有一个线程,但我需要创建许多 Futures(承诺)。

Promise 是一种非常普遍的编程技术,我认为Future 是 Python 的 Promise 实现。但是如果不建议像promise那样使用的话,pythonistas常用的有哪些呢?

注意

我使用 Python 2.7 backport of concurrent.futures to 2.7

【问题讨论】:

  • Executor 类甚至没有实现创建期货——子类可以。我刚刚使用了 Future 类。这没有问题。或许作者知道为什么会这样写。
  • @User 我的意思是子类。我想我也会使用它们。 p.s.很酷的昵称。

标签: python concurrency promise future concurrent.futures


【解决方案1】:

使用Future 将非promise API 包装到promise 中是完美的fine

一般不应该被创建的原因是因为大多数时候人们直接创建期货是因为他们是doing the deferred anti pattern并且包装一个执行者在另一个未来创造了未来。

值得一提的是,这个未来的实现是非常弱,它类似于 Java 的旧未来,承诺给你的很酷的东西就像链式的缺失一样。值得一提的是,像 Python 的 Twisted 的 JavaScript got their promises 这样的语言有更好的实现,即使它与其他东西交织在一起。

【讨论】:

  • 您对文档有什么看法? "should not be created directly except for testing"_"should only be used by Executor implementations and unit tests" - 这些是非常精确的陈述,它们明确表示,Future 应该直接创建并禁止其他所有内容。
  • 回复:“很酷的东西 promises 给你的东西就像链式的缺失一样”——这让我非常恼火,所以把 concurrent.futures.Future 放在一起扩展为支持 Promises/A+ .then(success, error) API (github.com/dvdotsenko/python-future-then)
  • “Python 的 Twisted,实现更好”:你的意思是 Twisted 的实现比 concurrent.futures 更好,而不是与 JavaScript 相比,对吧?我的印象是,符合 Promise/A+ 的实现优于 Twisted - 而 IIUC 目前所有流行的 JavaScript 实现都包括 Promise/A+ 合规性以及一些有用的附加功能。
  • @max 你理解正确 - 尽管现代 Python 现在有更好的未来。
猜你喜欢
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 2020-04-15
  • 2017-04-29
  • 1970-01-01
  • 2017-05-22
相关资源
最近更新 更多