使用`concurrent.futures.Future`作为 promise

12
在Python的docs中,我看到:

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

我想在我的代码中将其用作承诺,并且我非常惊讶它不建议像这样使用。
我的用例:
我有一个单线程从套接字读取数据包,我有许多回调函数根据数据包中包含的一些信息进行调用。数据包是消费者请求的响应,所有消费者都使用单个连接。每个消费者收到一个承诺并添加一些处理程序,当响应到达时调用这些处理程序。
因此,我不能在这里使用Executor子类,因为我只有一个线程,但我需要创建许多Futures(承诺)。
承诺是一种相当普遍的编程技术,我认为Future是Python的承诺实现。但是,如果不建议像承诺那样使用它,那么Python开发人员通常用于此目的的是什么?
我使用 Python 2.7,concurrent.futures 回溯到 2.7 版本

Executor类甚至不实现创建futures的功能 - 子类实现。我只使用了Future类。这没有问题。也许作者知道为什么要写在那里。 - User
@用户 我的意思是子类。我想我也会使用它们。附言:很酷的昵称。 - Gill Bates
1个回答

8

使用Future来将非Promise API包装成Promise是完全可以的,这是可以接受的。

通常情况下不应该创建它的原因是因为大多数时候人们直接创建future是因为他们在使用延迟反模式,将执行器创建的future包装在另一个future中。

值得一提的是,这个future实现非常弱,类似于Java旧的future,像链式调用这样的酷炫功能都没有。值得一提的是,像JavaScript这样的语言从Python的Twisted中学习到了Promise,它有更好的实现,即使它与其他内容交织在一起。


关于文档,你有什么看法?"_“除了测试之外,不应直接创建”_(https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Future)或者"_“只应由Executor实现和单元测试使用”_(https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Future.set_result)- 这些都是非常精确的陈述,它们明确说明了Future应该在哪里直接创建,并禁止其他任何操作。 - Gill Bates
回复:“很酷的东西承诺给你像链接一样,只是缺失了” - 这让我非常恼火,所以我组合了 concurrent.futures.Future 并扩展支持 Promises/A+ .then(success, error) API(https://github.com/dvdotsenko/python-future-then) - ddotsenko
“Python的Twisted,它有更好的实现”:你的意思是与concurrent.futures相比,Twisted的实现更好,而不是与JavaScript相比,对吗?我一直以为符合Promises/A+标准的实现比Twisted更优秀 - 并且据我所知,现在所有流行的JavaScript实现都包括Promise/A+合规性以及一些有用的额外功能。 - max
@max 你理解得很正确 - 虽然现代Python现在有更好的未来。 - Benjamin Gruenbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接