Gzip con Python 2.7–3.x


Hace poco estuve pensando sobre la manera en que aprendemos a llevar a cabo las tareas de administración de un servidor GNU/Linux, el cual nos brinda un sin fin de comandos para el día a día. Lo primero que aprendemos es a realizarlas desde una terminal, claro, siempre y cuando el esfuerzo sea humanamente alcanzable. Lo segundo, es la automatización vía bash scripting, con la cual resolvemos todo aquello que no estamos dispuestos a realizar frecuentemente.

En mi eterna necesidad de aprender nuevas habilidades y ponerlas en marcha lo antes posible, contemplé la viabilidad de hacer las mismas automatizaciones desde una perspectiva más enfocada a la programación en Python. Esto por dos razones:

* Sentirme más cómodo con la sintaxis y librerías de Python. En efecto, quiero aprender, mejorar y dominar este lenguaje (y pensamiento de programador sin llegar a ser uno).

* Ayudar a mi cerebro a que pueda resolver problemas obvios con diferentes alternativas.

Así que llegó la primer oportunidad, comprimir archivos de log y binarios según los parámetros establecidos. Sin duda la tarea ideal; por un lado nada compleja, por el otro, suficiente para tirar unas cuantas líneas de código.

Lo primero que hice fue probar mi local, claro, como contención de posibles daños. Como tampoco es que no tenga nociones de programación, armé mi ambiente con la última versión de Python (3.6 en este momento). Después probé en la 2.7 y en la 2.6, no funcionando en ésta última con los archivos binarios.

import gzip
import shutil
import sys
import os
try:
for s_file in sys.argv[1:]:
print(“Args: {}”.format(s_file))
file_in = open(s_file, ‘rb’)
gzip_file = gzip.open(s_file+’.gz’, ‘wb’)
shutil.copyfileobj(file_in, gzip_file)
gzip_file.close()
file_in.close()
os.remove(s_file)
print(“Successful”)
except Exception as ex:
print(ex)

Y cómo no podía ser de otra manera, lo pensé para recibir más de un archivo al mismo tiempo.
Este primer procedimiento me dio una segunda idea, la cual no he probado, pero no tardo en hacerlo.
¿Qué pasa si lo realizo con hilos?
A priori puedo pensar en algunos factores:
No requiero que sea thread-safe, porque cada hilo trabajará sobre un archivo distinto, por tanto, no hay problemas de bloqueo o modificación de variables que puedan derivar en un comportamiento inesperado y errático.
Los hilos son ideales para I/O (con sus respectivas excepciones).
Puede incrementarse el consumo de CPU, por tanto, debo ser cuidadoso de probarlo suficientemente para no impactar servidores productivos, produciendo inanición de recursos y llamadas telefónicas del cliente lanzando fuego por la boca.

En cuanto tenga los resultados los agregaré como una actualización.

Comentarios

Entradas populares