Pausa Python Generator

Tengo un generador de Python que hace un trabajo que produce una gran cantidad de datos, que consume una gran cantidad de memoria RAM. ¿Hay alguna forma de detectar si los datos procesados ​​han sido “consumidos” por el código que utiliza el generador y, de ser así, hacer una pausa hasta que se consum?

def multi_grab(urls,proxy=None,ref=None,xpath=False,compress=True,delay=10,pool_size=50,retries=1,http_obj=None): if proxy is not None: proxy = web.ProxyManager(proxy,delay=delay) pool_size = len(pool_size.records) work_pool = pool.Pool(pool_size) partial_grab = partial(grab,proxy=proxy,post=None,ref=ref,xpath=xpath,compress=compress,include_url=True,retries=retries,http_obj=http_obj) for result in work_pool.imap_unordered(partial_grab,urls): if result: yield result 

corre de:

 if __name__ == '__main__': links = set(link for link in grab('http://www.reddit.com',xpath=True).xpath('//a/@href') if link.startswith('http') and 'reddit' not in link) print '%s links' % len(links) counter = 1 for url, data in multi_grab(links,pool_size=10): print 'got', url, counter, len(data) counter += 1 

Un generador simplemente produce valores. No hay forma de que el generador sepa qué se está haciendo con ellos.

Pero el generador también se detiene constantemente, ya que la persona que llama hace lo que hace. No se ejecuta de nuevo hasta que la persona que llama lo invoca para obtener el siguiente valor. No se ejecuta en un hilo separado ni nada. Parece que tienes una idea errónea acerca de cómo funcionan los generadores. ¿Puedes mostrar algún código?

El objective de un generador en Python es deshacerse de objetos adicionales que no sean necesarios después de cada iteración. La única vez que mantendrá esos objetos adicionales (y, por lo tanto, un ram adicional) es cuando se hace referencia a los objetos en otro lugar (como agregarlos a una lista). Asegúrate de no guardar estas variables innecesariamente.

Si está tratando con multiproceso / procesamiento, es probable que desee implementar una Cola de la que podría extraer datos, haciendo un seguimiento de la cantidad de tareas que está procesando.

Creo que puedes estar buscando la función de yield . Explicado en otra pregunta de StackOverflow: ¿Qué hace la palabra clave “rendimiento” en Python?

Una solución podría ser utilizar una Queue a la que el generador agregaría datos, mientras que otra parte del código obtendría los datos y los procesaría. De esta forma, puede asegurarse de que no haya más de n elementos en la memoria al mismo tiempo.