是否可以使用only Python 3.6.1 Standard Library编写promise个(或多个任务)的序列?

例如,JavaScript中的一个序列写为:

const SLEEP_INTERVAL_IN_MILLISECONDS = 200;

const alpha = function alpha (number) {
    return new Promise(function (resolve, reject) {
        const fulfill = function() {
            return resolve(number + 1);
        };

        return setTimeout(fulfill, SLEEP_INTERVAL_IN_MILLISECONDS);
    });
};

const bravo = function bravo (number) {
    return new Promise(function (resolve, reject) {
        const fulfill = function() {
            return resolve(Math.ceil(1000*Math.random()) + number);
        };
        return setTimeout(fulfill, SLEEP_INTERVAL_IN_MILLISECONDS);
    });
};

const charlie = function charlie (number) {
    return new Promise(function (resolve, reject) {
        return (number%2 == 0) ? reject(number) : resolve(number);
    });
};

function run() {
    return Promise.resolve(42)
        .then(alpha)
        .then(bravo)
        .then(charlie)
        .then((number) => {
            console.log('success: ' + number)
        })
        .catch((error) => {
            console.log('error: ' + error);
        });
}

run();

每个函数also returns a Promise具有异步处理结果,该结果将由紧接着的promise 解决/拒绝.

我知道像promises-2.01basyncio 3.4.3这样的库,我正在寻找Python STL解决方案.因此,如果需要导入非STL库,我更喜欢使用RxPython.

推荐答案

下面是一个使用asyncio和async/await语法的类似程序:

import asyncio
import random

async def alpha(x):
    await asyncio.sleep(0.2)
    return x + 1 

async def bravo(x):
    await asyncio.sleep(0.2)
    return random.randint(0, 1000) + x

async def charlie(x):
    if x % 2 == 0:
        return x
    raise ValueError(x, 'is odd')

async def run():
    try:
        number = await charlie(await bravo(await alpha(42)))
    except ValueError as exc:
        print('error:', exc.args[0])
    else:
        print('success:', number)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run())
    loop.close()

编辑:如果你对react 流感兴趣,你可以考虑使用aiostream.

下面是一个简单的例子:

import asyncio
from aiostream import stream, pipe

async def main():
    # This stream computes 11² + 13² in 1.5 second
    xs = (
        stream.count(interval=0.1)      # Count from zero every 0.1 s
        | pipe.skip(10)                 # Skip the first 10 numbers
        | pipe.take(5)                  # Take the following 5
        | pipe.filter(lambda x: x % 2)  # Keep odd numbers
        | pipe.map(lambda x: x ** 2)    # Square the results
        | pipe.accumulate()             # Add the numbers together
    )
    print('11² + 13² = ', await xs)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()

documentation页中有更多的例子.

免责声明:我是项目维护者

Python-3.x相关问答推荐

在多个测试中维护和报告变量

Python:字典和列表:在列表字典中搜索子列表的有效方法

如何使用PySide6创建切换框架?

从.csv导入将文件夹路径加入到文件名

根据另一列中的条件填写该列中的值

如何从包含SPAN文本的标记中获取链接

torch.stack([t1, t1, t1], dim=1)与torch.hstack([t1, t1, t1])之间有什么区别?

基于Pandas列动态创建分箱,以使观测值数量或计数占总计数的1%.

一起使用数据类和枚举

转换Pandas 数据框 - 添加行

Tkinter IntVar 返回 PY_VAR0 而不是值

python 3集合中的Discard()和Remove()函数有什么区别

将字符串表示与使用整数值的枚举相关联?

如何在 Spyder 控制台中使用变量执行 Python 3.3 脚本?

在 ubuntu 20.04 中安装 libpq-dev 时出现问题

每次启动 Google Colab 时都必须安装所需的软件包吗?

python - 使用 matplotlib 和 boto 将绘图从内存上传到 s3

Python pathlib 获取父级相对路径

Python 2 与 Python 3 - urllib 格式

如何使用 Celery 和 Django 将任务路由到不同的队列