openYuanrong 生成器#

Python 语言中,使用了 yield 关键字的函数被称为生成器(generator)。生成器函数是一种特殊的函数,可以在迭代过程中逐步产生结果,而不是一次性的返回所有的值。所有使用 yr.instanceyr.invoke 装饰的生成器称为 openYuanrong 生成器。

使用场景#

生成器每次迭代只计算并返回一个值,无需一次性将所有值加载到内存中,可以有效地节省内存空间。常用场景包括:

  • 无限序列:生成器可以用于生成无限序列,而不会耗尽内存。

  • 数据流处理:生成器可以用于处理大量数据流,例如从文件中逐行读取数据或从网络流中接收数据。

使用示例#

openYuanrong 生成器返回一个 ObjectRefGenerator 对象,通过该对象可调用 _next_anext 方法,也可以迭代遍历。

遍历操作可能返回以下异常:

类型

描述

RuntimeError

获取 yield 返回值失败。

YRInvokeError

函数执行错误。

Note

异步生成器只能在有状态函数中实现,无状态函数不支持异步。

无状态函数生成器#

import yr

yr.init()

@yr.invoke
def countdown(n):
    while n > 0:
        yield n
        n -= 1

n = 5
# 使用 next 接口
generator = countdown.invoke(n)
print(yr.get(next(generator)))

# 使用 for 循环
for ref in generator:
    print(yr.get(ref))

yr.finalize()

有状态函数生成器#

import yr

yr.init()

@yr.instance
class StatefulFunc():
    def __init__(self, number):
        self.sum = number

    def countdown(self):
        n = self.sum
        while n > 0:
            yield n
            n -= 1

n = 5
instance = StatefulFunc.invoke(n)

# 使用 next 接口
generator = instance.countdown.invoke()
print(yr.get(next(generator)))

# 使用 for 循环
for ref in generator:
    print(yr.get(ref))

instance.terminate()
yr.finalize()

有状态函数异步生成器#

import asyncio
import time
import yr

yr.init()

@yr.instance
class StatefulFunc():
    async def gen(self, n):
        for i in range(n):
            await asyncio.sleep(1)
            yield i

instance = StatefulFunc.invoke()

async def async_gen(n):
    gen = instance.gen.invoke(n)
    async for ref in gen:
        res = await ref
        print(res)

async def multi_gen():
    n = 5
    await asyncio.gather(async_gen(n), async_gen(n), async_gen(n), async_gen(n), async_gen(n))

now = time.time()
asyncio.run(multi_gen())
cost = time.time() - now
# 并发执行 5 个 generator 函数,每个函数用时 5s, 总用时小于 6s
print(cost)

instance.terminate()
yr.finalize()