使用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
。您将如何捕获返回值以便我可以打印它们?
答案 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
/ except
或outcome
库。或者,当每个操作完成时,您都可以将其返回值放入trio.Queue
中,以便另一个任务可以在结果完成时对其进行处理。希望这可以为您提供一个很好的起点:-)
答案 1 :(得分:0)
在这种情况下,只需在父级中创建数组,然后将每个数组传递给需要它的子级。
通常,将对象传递给任务;他们可以在上面设置属性。您还可以添加一个Event
,以便父级可以等待结果可用。