捕获苗圃对象的返回值

时间:2018-07-28 02:09:43

标签: python-3.x python-trio

使用trio和nursery对象时,如何捕获从方法返回的任何值?

从三重奏网站获取this示例:

async def append_fruits():
    fruits = []
    fruits.append("Apple")
    fruits.append("Orange")
    return fruits

async def numbers():
    numbers = []
    numbers.append(1)
    numbers.append(2)
    return numbers

async def parent():
    async with trio.open_nursery() as nursery:
        nursery.start_soon(append_fruits)
        nursery.start_soon(numbers)

我对其进行了修改,以便每个方法都返回一个list。您将如何捕获返回值以便我可以打印它们?

2 个答案:

答案 0 :(得分:5)

当前,没有内置的机制。主要是因为我们还没有弄清楚我们甚至希望它如何工作,因此,如果您有一些建议会有所帮助:-)。

问题是,使用常规函数,只有一个明显的地方可以访问返回值–调用方正在等待,因此您将完成的返回值交给他们。对于并发函数,调用者无需等待,因此您还需要某种方式来指定将其返回到的位置,何时返回它,如果有多个函数,则必须跟踪哪个函数正在返回值,等等。上。这不是一个简单的概念。

您想对返回值做什么?您是否想在每个函数返回时立即打印它们?在那种情况下,最简单的事情就是直接从任务中完成:

async def print_fruits():
    print(await fruits())

async def print_numbers():
    print(await numbers())

async with trio.open_nursery() as nursery:
    nursery.start_soon(print_fruits)
    nursery.start_soon(print_numbers)

您甚至可以将其分解为辅助函数:

async def call_then_print(fn):
    print(await fn())

async with trio.open_nursery() as nursery:
    nursery.start_soon(call_then_print, fruits)
    nursery.start_soon(call_then_print, numbers)

或者也许您想将它们放入数据结构中以便以后查看?

results = {}

async def store_fruits_in_results_dict():
    results["fruits"] = await fruits()

async def store_numbers_in_results_dict():
    results["numbers"] = await numbers()

async with trio.open_nursery() as nursery:
    nursery.start_soon(store_fruits_in_results_dict)
    nursery.start_soon(store_numbers_in_results_dict)

# This is after the nursery block, so we know that the dict is fully filled in:
print(results["fruits"])
print(results["numbers"])

您也可以想象它们的更高级版本-例如,有时当您并行运行许多任务时,您希望捕获异常,而不仅仅是返回值,因此即使某些任务失败,某些任务仍然可以成功。为此,您可以在每个单独的函数周围使用try / exceptoutcome库。或者,当每个操作完成时,您都可以将其返回值放入trio.Queue中,以便另一个任务可以在结果完成时对其进行处理。希望这可以为您提供一个很好的起点:-)

答案 1 :(得分:0)

在这种情况下,只需在父级中创建数组,然后将每个数组传递给需要它的子级。

通常,将对象传递给任务;他们可以在上面设置属性。您还可以添加一个Event,以便父级可以等待结果可用。