[pyar] De imports, multiprocessing y memoria utilizada

Andres Riancho andres.riancho en gmail.com
Dom Abr 29 16:11:54 ART 2012


Claudio,

2012/4/29 Claudio Freire <klaussfreire en gmail.com>:
> 2012/4/28 Andres Riancho <andres.riancho en gmail.com>:
>>    Lamentablemente esto no funciona, obtengo siempre algo como lo
>> siguiente (sin importar si le doy mas o menos timeout):
>>
>> """
>>  File "/home/xyz/workspace/w3af/core/controllers/dependency_check/lazy_load.py",
>> line 38, in lazy_load
>>    return result.get(timeout=5)
>>  File "/usr/lib/python2.6/multiprocessing/pool.py", line 418, in get
>>    raise TimeoutError
>> multiprocessing.TimeoutError
>> """
>
> Yo no tengo ese problema con el mismo código (usando 'numpy' como module_name).

Interesante... este comentario me hizo probar un poco mas,

> De hecho, de lo que se de multiprocessing imagino que sólo podría
> darte timeout si el subproceso estuviera muriéndose con segmentation
> fault o algo por el estilo, algo más "grave" que una excepción o error
> de import. Algo probablemente relacionado a w3af o alguna biblioteca
> de extensión que no se lleva bien con multiprocessing.

Bueno... despues de algunas pruebas llegue a algo que no esperaba, ahi
va el codigo dentro de lazy_load.py:

"""
from multiprocessing import Pool

def _module_load_worker(module_name):
   try:
       __import__(module_name)
   except:
       return False
   else:
       return True

def _lazy_load(module_name):
   pool = Pool(processes=1)
   result = pool.apply_async(_module_load_worker, [module_name])
   return result.get(timeout=5)

print _lazy_load('sys')
"""

Y dos pruebas, primero la que funciona:

"""
xyz en xyz-laptop:/tmp$ python lazy_load.py
True
"""

Despues la que no funciona:

"""
xyz en xyz-laptop:/tmp$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import lazy_load
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lazy_load.py", line 16, in <module>
    print lazy_load('sys')
  File "lazy_load.py", line 14, in lazy_load
    return result.get(timeout=5)
  File "/usr/lib/python2.6/multiprocessing/pool.py", line 418, in get
    raise TimeoutError
multiprocessing.TimeoutError
>>>
"""

Al parecer a multiprocessing no le gusta ser llamado cuando al tope
del call-trace hay un import?! Resulta que este es el caso en w3af,
obviamente puedo hacer que no lo sea... pero ahora me da mucha
curiosidad saber el porque de esta cosa tan rara... sera un bug?

> Si es así, te recomendaría hacer el chequeo de import antes de cargar
> ninguna biblioteca de extensión, capaz que evitás el problema. O
> podrías usar subprocess.Popen para ejecutar un comando que chequee la
> existencia del módulo en un subproceso sin forkear, tipo "python -c
> 'import blah'".
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar



-- 
Andrés Riancho
Project Leader at w3af - http://w3af.org/
Web Application Attack and Audit Framework



More information about the pyar mailing list