[pyar] can't start new thread

Gerardo Herzig gherzig en fmed.uba.ar
Lun Mayo 2 18:16:31 ART 2011


Hola chicos. Tengo una pequeña aplicacion que me esta tirando ese error.

No logro dar pie con bola, aunque supongo que el asunto viene porque me
esta faltando cerrar los threads, o algo relacionado.

Este programin recorre los directorios, y por cada directorio abre un
hilo por cada archivo que procesa (en particular, ahora esta seteado
para procesar unicamente pdf's)

En cada directorio hay a lo sumo 20 pdf's. Por eso supongo que la cosa
viene por algo en la finalizacion de los threads:

Se que el mail es muy largo, e incluso faltan algunas bibliotecas para
que les funcione, pero me la juego a que lo puedan seguir a ojimetro, y
me sepan tirar alguna papusa.

Gracias chicos!

Este es el prg principal:

#! /usr/bin/python
# -*- coding: UTF-8 -*-

import defaultValues
from threading import Thread
from Queue import Queue
import os
import time
import string
from GAG3.Logger.Logger import Logger
from ArchivoPDF import ArchivoPDF
from ArchivoHTML import ArchivoHTML

class ProcesaDirectorioConHilos(object):
 _extensiones_validas = ['htm']
 def __init__(self,dirname): 
  self.queue = Queue()
  self.num_threads = 5
  self.dirname = dirname
  for archivo in [x for x in os.listdir(os.path.join(dirname)) if
      os.path.isfile(os.path.join(dirname,x))]:
   extension = string.lower(os.path.splitext(archivo)[-1][1:])
   if extension in self._extensiones_validas:
    self.queue.put(archivo)
    
 def process(self):
  for x in range(self.num_threads):
   worker = Thread(target = processFile, args = (self.dirname,
self.queue))

   worker.setDaemon(True)
   worker.start()
   self.queue.join()

def processFile(dir, q):
 _extensiones_validas = ['htm']

 while True:
  if not q.empty():
   archivo = q.get()
   extension = string.lower(os.path.splitext(archivo)[-1][1:])
   if extension in _extensiones_validas:
    
    if extension == 'pdf':
     f = ArchivoPDF(dir,archivo)
    elif extension in ('html', 'htm'):
     f = ArchivoHTML(dir, archivo)
    else:
     pass #Extension no soportada / implementada
    try:
     f.save()
    except:
     pass
    finally:
     q.task_done()
     

La clasesita ArchivoHTML:

import ArchivoBase

class ArchivoHTML(ArchivoBase.ArchivoBase):

  def process(self):
    _body = self._file.readlines()
    _body = ''.join([x.strip() for x in _body])
    return _body

Y la clase ArchivoBase:

import defaultValues
from GAG3.DbRequired.db import DB
import os
import time

class ArchivoBase(object):
 """
 Clase base para todas los tipos de archivo soportados
 """
 def __init__(self,dirName, fileName):
  self.root = '/mnt/'
  self.fileName = fileName
  self.path = u'%s'.encode("ascii", "ignore") % os.path.join(dirName,
fileName)
  self._file = open(self.path)
  self.path_web = u'%s'.encode("ascii", "ignore") %
os.path.join(dirName, fileName).replace(self.root,'/')
  self.db = DB()
  self.db.connect()
  self.db.doQuery("set client_encoding to 'latin1'", None)

 def process(self):
  pass

 def esNuevo(self):
  ###Retorna True si el archivo en cuestion no aparece en la base

  existe = self.db.doQuery("select page_id from gse_data where url='%s'"
% self.path_web)
  if not existe:
   return True
  else:
   return False  

 def estaActualizado(self):
  este = self.last_modified_timestamp()
  try:
   actual = self.db.doQuery("select last_modified_timestamp from
gse_data where url='%s'" % self.path_web, [])[0][0]
  except:
   return True
  if este > actual: #Hay que actualizar 
   return False
else:
   return True

 def last_modified_timestamp(self):
  return os.stat(self.path).st_mtime


 def save(self):
  try:
   if self.esNuevo():
    body = self.process()
    self.db.doQuery("""insert into
gse_data(url,body,last_modified_timestamp) values ('%s', $_$%s$_$,%d)"""
% (self.path_web, body.strip(), self.last_modified_timestamp()), None)

   else:
    if not self.estaActualizado():
     body = self.process()
     self.db.doQuery("""update gse_data set body = $_$%s$_
$,last_modified_timestamp = %d where url='%s'""" % (body.strip(),
self.last_modified_timestamp(),self.path_web), None)

   else: ## Ni es nuevo, ni esta desactualizado
     _logger.info('%s up_to_date. Nada para hacer' % self.path)

  finally:
   self._file.close()
   self.db.connection.close()
   return




More information about the pyar mailing list