(注:此问题严格限于 API 的设计,不涉及如何实现它;即我只关心我的 API 的客户端在这里看到什么,而不是我必须做什么才能使它正常工作。)
简单来说:我想知道 Python 中 显式 future(又名 promises、deferreds、tasks——名称取决于框架)的已建立模式(如果有的话)。以下是更详细的描述。
考虑这样一个简单的 Python API:
现在,在其他语言和框架中,通常存在强制或至少是已经确立的 API 模式。例如,在 .NET 版本 4 之前,人们通常会提供一对
另一个例子是,在 JavaScript 中,标准库中没有涵盖这个方面的内容,但 jQuery 已经推广了 "deferred promise" 接口,现在已经 单独指定。因此,如果我要在 JS 中编写异步的
那么,在 Python 中,是否有已经确立的模式呢?浏览标准库,我看到有几个模块提供异步 API,但它们之间没有一致的模式,也没有像 "tasks" 或 "promises" 的标准化协议。也许可以从流行的第三方库中推导出某些模式?
简单来说:我想知道 Python 中 显式 future(又名 promises、deferreds、tasks——名称取决于框架)的已建立模式(如果有的话)。以下是更详细的描述。
考虑这样一个简单的 Python API:
def read_line():
...
s = read_line()
print(s)
这是同步版本 - 如果一行还不可用,它将会阻塞。现在假设我想提供一个相应的异步(非阻塞)版本,允许注册回调函数一旦操作完成就被调用。例如,一个简单的版本可能如下所示:
def read_line_async(callback):
...
read_line_async(lambda s: print(s))
现在,在其他语言和框架中,通常存在强制或至少是已经确立的 API 模式。例如,在 .NET 版本 4 之前,人们通常会提供一对
BeginReadLine
/EndReadLine
方法,并使用默认的 IAsyncResult
接口注册回调并传递结果值。在 .NET 4+ 中,人们使用 System.Threading.Tasks
,以启用所有任务组合操作(WhenAll
等),并连接到 C# 5.0 的 async
特性。另一个例子是,在 JavaScript 中,标准库中没有涵盖这个方面的内容,但 jQuery 已经推广了 "deferred promise" 接口,现在已经 单独指定。因此,如果我要在 JS 中编写异步的
readLine
,我将把它命名为 readLineAsync
,并在返回值上实现 then
方法。那么,在 Python 中,是否有已经确立的模式呢?浏览标准库,我看到有几个模块提供异步 API,但它们之间没有一致的模式,也没有像 "tasks" 或 "promises" 的标准化协议。也许可以从流行的第三方库中推导出某些模式?
我也看到了Twisted中经常提到的Deferred类,但它似乎对于通用的promise API来说过于复杂,并且更适合于此库的特定需求。它看起来不像是我可以轻松克隆接口的东西(而不需要依赖它们),这样如果客户端在应用程序中同时使用这两个库,我们的promises就可以很好地互操作。是否有其他流行的库或框架专门为此设计API,我可以复制(并与之互操作),而不需要直接依赖?
concurrent.futures.Future
是正确的选择。 - Pavel Minaevconcurrent.futures
已经从3.2回溯到2.6+ https://code.google.com/p/pythonfutures/ - ddotsenko