Soy bastante nuevo en python. Estoy usando el módulo de multiprocesamiento para leer líneas de texto en stdin, convirtiéndolas de alguna manera y escribiéndolas en una base de datos. He aquí un fragmento de mi código:python pool apply_async y map_async no bloquean en cola completa
batch = []
pool = multiprocessing.Pool(20)
i = 0
for i, content in enumerate(sys.stdin):
batch.append(content)
if len(batch) >= 10000:
pool.apply_async(insert, args=(batch,i+1))
batch = []
pool.apply_async(insert, args=(batch,i))
pool.close()
pool.join()
Ahora que todo funciona bien, hasta que llego a procesar enormes archivos de entrada (cientos de millones de líneas) que la tubería i en mi programa pitón. En algún momento, cuando mi base de datos se vuelve más lenta, veo que la memoria se está llenando.
Después de jugar un poco, resultó que pool.apply_async y pool.map_async nunca bloquean, por lo que la cola de las llamadas a procesar crece cada vez más.
¿Cuál es el enfoque correcto para mi problema? Esperaría un parámetro que pueda establecer, que bloqueará la llamada pool.apply_async, tan pronto como se haya alcanzado una determinada longitud de cola. AFAIR en Java uno puede darle al ThreadPoolExecutor una BlockingQueue con una longitud fija para ese propósito.
Gracias!
_ "Resultó que pool.apply_async, así como pool.map_async nunca bloquear" _ - todo lo que estaba buscando – leon