Esta sería mi solución simple utilizando el threading
módulo. Creo que asyncio
es demasiado para un caso de uso simple, pero podría implementarse en una situación compleja como una aplicación web.
import ee
import threading
ee.Initialize()
def retrieve(f):
def wrap(obj, *args):
f(obj.getInfo(), *args)
return wrap
def evaluate(obj, callback, args):
args.insert(0, obj)
callback = retrieve(callback)
thd = threading.Thread(target=callback, args=args)
thd.start()
# EE object
eeobj = ee.List([1,2,3,4,5,6])
# use case 1: printing values
def callback1(obj, n):
print([i*n for i in obj])
evaluate(eeobj, callback1, [5])
# use case 2: filling a container
container = []
def callback2(obj, cont):
""" filling a container """
for item in obj:
cont.append(item)
evaluate(eeobj, callback2, [container])
# wait 2 sec and...
print(container)
Para probarlo (en Spyder por ejemplo) recomiendo ejecutarlo por partes. Si lo ejecutas todo a la vez no podrás ver el comportamiento correctamente.
ACTUALIZACIÓN
puede utilizarlo a través del geetools
paquete
import ee
ee.Initialize()
import geetools
# EE object
eeobj = ee.List([1,2,3,4,5,6])
# use case 1: printing values
def callback1(obj, n):
print([i*n for i in obj])
geetools.evaluate(eeobj, callback1, [5])