tutorial programming loop español asyncio async python python-3.x python-3.4 python-asyncio

python - programming - Obtención de valores de funciones que se ejecutan como tareas asíncronas.



python async api (3)

Los coroutines funcionan como están. Simplemente use el valor devuelto de loop.run_until_complete() y llame a asyncio.gather() para recopilar múltiples resultados :

#!/usr/bin/env python3 import asyncio @asyncio.coroutine def func_normal(): print(''A'') yield from asyncio.sleep(5) print(''B'') return ''saad'' @asyncio.coroutine def func_infinite(): for i in range(10): print("--%d" % i) return ''saad2'' loop = asyncio.get_event_loop() tasks = func_normal(), func_infinite() a, b = loop.run_until_complete(asyncio.gather(*tasks)) print("func_normal()={a}, func_infinite()={b}".format(**vars())) loop.close()

Salida

--0 --1 --2 --3 --4 --5 --6 --7 --8 --9 A B func_normal()=saad, func_infinite()=saad2

Estaba probando el siguiente código:

import asyncio @asyncio.coroutine def func_normal(): print("A") yield from asyncio.sleep(5) print("B") return ''saad'' @asyncio.coroutine def func_infinite(): i = 0 while i<10: print("--"+str(i)) i = i+1 return(''saad2'') loop = asyncio.get_event_loop() tasks = [ asyncio.async(func_normal()), asyncio.async(func_infinite())] loop.run_until_complete(asyncio.wait(tasks)) loop.close()

No puedo averiguar cómo obtener valores en las variables de estas funciones. No puedo hacer esto

asyncio.async(a = func_infinite())

ya que esto haría de este un argumento de palabra clave. ¿Cómo hago para lograr esto?


Si desea utilizar cualquier valor devuelto por coroutine tan pronto como termine, puede pasar un objeto futuro al coro y actualizar este futuro mediante un valor calculado. Tan pronto como se actualice el futuro, pasa su future.result () a la función de devolución de llamada que está vinculada con el futuro dado. Ver código a continuación:

import asyncio async def func_normal(future): print("A") await asyncio.sleep(5) print("B") # return ''saad'' future.set_result(''saad'') async def func_infinite(future): i = 0 while i<10: print("--"+str(i)) i = i+1 # return(''saad2'') future.set_result(''saad2'') def got_result(future): print(future.result()) loop = asyncio.get_event_loop() future1 = asyncio.Future() future2 = asyncio.Future() future1.add_done_callback(got_result) future2.add_done_callback(got_result) # Coros are automatically wrapped in Tasks by asyncio.wait() coros = [ func_normal(future1), func_infinite(future2)] loop.run_until_complete(asyncio.wait(coros)) loop.close()

La función de devolución de llamada se llama con un solo argumento: el objeto futuro con el que está vinculado. Si necesita pasar más argumentos a la devolución de llamada, utilice un paquete parcial de functools:

future1.add_done_callback(functools.partial(print, "future:", argin))

llamará

print("future:", argin)


loop.run_until_complete devuelve el valor devuelto por la función que le pasa. Entonces, devolverá la salida de asyncio.wait :

import asyncio @asyncio.coroutine def func_normal(): print("A") yield from asyncio.sleep(5) print("B") return ''saad'' @asyncio.coroutine def func_infinite(): i = 0 while i<10: print("--"+str(i)) i = i+1 return(''saad2'') loop = asyncio.get_event_loop() tasks = [ asyncio.async(func_normal()), asyncio.async(func_infinite())] done, _ = loop.run_until_complete(asyncio.wait(tasks)) for fut in done: print("return value is {}".format(fut.result())) loop.close()

Salida:

A --0 --1 --2 --3 --4 --5 --6 --7 --8 --9 B return value is saad2 return value is saad

También puede acceder a los resultados directamente desde la matriz de tasks :

print(tasks[0].result()) print(tasks[1].result())