[Python-es] problema con sqlite3 y hilos (solucionado)

Miguel Barraza correo en miguelbarraza.com.ar
Vie Ago 31 15:12:57 CEST 2012


buenas, muchas gracias.
poniendo esa sintacsis a la hora de conectar, ya no me tira problemas al utilizar hilos, así que puedo compartir la conexión entre las clases y ya puedo trabajar perfectamente con una sola conexión a la db.
me solucionaste la vida!.

un abrazo y saludos.

atte, Miguel

Subject: Re: [Python-es] problema con sqlite3 y hilos


  Hola,
    yo me encontré con el mismo problema y lo resolví así:
   * conexión:   con=sqlite3.connect(sfich, isolation_level='DEFERRED', check_same_thread = False)
      De esta manera, el driver de SQLite no comprueba si es el mismo thread o no
   * SIEMPRE que voy a usar SQLite,  lo hago en una sección crítica rodeada de un bloqueo:
     + Objeto de bloqueo: lock=threading.Lock()
     + Comienzo de sección crítica: lock.acquire()
     + Final de sección crítica:
       finally:
           lock.release()

  Un saludo!




  El 31/08/2012 2:14, Miguel Barraza escribió:

    buenas, también ya lo intenté.
    creé una clase master que era la única que tenga la conexión a bd.
    pero cuando el hilo llama a esta clase, me tira el mismo error, ya que detecta que está consultando desde un hilo que no es el master.

    pero bueno...seguiré intentando haber si ahi otra forma de hacer lo mismo sin hilos. pero que funcione con el mismo rendimiento.

    un saludo.

    atte, Miguel

    Subject: Re: [Python-es] problema con sqlite3 y hilos


      no se usar sqlite pero se me ocurre una idea
      si el problema es k el segundo hilo no puedo usar el sql, crea en la clase del hilo principal métodos para consultar el sqlite y llamas esos métodos desde el hilo
      algo como esto: hacer una clase server, una clase cliente y una clase proxy
      server espera nuevos clientes y cuando se conecta uno lanza un hilo cliente
      proxy se ejecuta en su propio hilo, tiene acceso a la base de datos y los métodos k sean necesarios para consultarla
      cliente llama a los métodos de la clase-hilo proxy, creo k así los métodos se ejecutorian en el hilo del proxy... no estoy seguro d como hacer para k el hilo de proxy no se cierre solo, se me ocurre hacer k proxy abra una ventana vacía, incluso la puedes poner en segundo plano, y las llamadas de los clientes serian como eventos de la ventana
      no se mucho de hilos pero si el problema es k no se puede consultar sqlite desde otro hilo, pues hacer k un solo hilo haga las consultas



--------------------------------------------------------------------------
      From: correo en miguelbarraza.com.ar
      To: python-es en python.org
      Date: Thu, 30 Aug 2012 00:24:29 -0300
      Subject: [Python-es] problema con sqlite3 y hilos


      buenas, estoy haciendo una aplicación con sockets, cada cliente lo atiende en un hilo diferente.
      cada cliente hace consultas a una base sqlite3.
      pero al consultar me tira este error:

          self.db.execute(sql)
      ProgrammingError: SQLite objects created in a thread can only be used in that sa
      me thread.The object was created in thread id 2480 and this is thread id 3740

      al inicio hacía una sola conexión y le pasaba el puntero de conexión a el objeto que manejaba el cliente.
      pensé que ese era el error, así que hice una conexión por cada cliente dentro de la clase que gestiona cada conexión. y me tira el mismo error...así que llegué a la conclusión que sqlite no funciona con hilos...¿es eso cierto?...o de que forma puedo solucionar este problema?.

      lo que hice también fue hacer una conexión dentro de un objeto y pasar el puntero de ese objeto a todos los clientes, y hacer consultas a esa clase master para que devuelva los datos de base de datos. y igualmente tiró el mismo error.

      imagino que debe haber forma de trabajar con sqlite3 y hilos.
      así que por eso consulto: alguien se vio en este problema?, como lo pudo solucionar?.

      saludos a todos!.

      pd.: no copio parte del código ya que es bastante y no se donde exactamente podría estar el error...aunque como lo probé de varias formas y siempre tiró el mismo error creo que es la metodología, no es el código...tiene que haber alguna forma que no conozco para utilizar sqlite con hilos o procesos.

      atte, Miguel

      _______________________________________________ Python-es mailing list Python-es en python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/


--------------------------------------------------------------------------
      _______________________________________________
      Python-es mailing list
      Python-es en python.org
      http://mail.python.org/mailman/listinfo/python-es
      FAQ: http://python-es-faq.wikidot.com/


     

_______________________________________________
Python-es mailing list
Python-es en python.orghttp://mail.python.org/mailman/listinfo/python-esFAQ: http://python-es-faq.wikidot.com/

  Corporación RTVE - www.rtve.es
  AVISO LEGAL. Este mensaje está dirigido sólo a su destinatario y es confidencial. Si lo ha recibido por error, notifíquelo al remitente y borre el original. Cualquier uso inapropiado de este correo electrónico queda desautorizado. RTVE se reserva el ejercicio de las acciones legales oportunas contra quien acceda de forma ilegítima al contenido de cualquier mensaje de su procedencia.
   Antes de imprimir este e-mail, piensa bien si es necesario hacerlo. Una tonelada de papel implica la tala de 15 árboles. Cuida el medio ambiente.


------------------------------------------------------------------------------


  _______________________________________________
  Python-es mailing list
  Python-es en python.org
  http://mail.python.org/mailman/listinfo/python-es
  FAQ: http://python-es-faq.wikidot.com/
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20120831/e3606cd1/attachment.html>


Más información sobre la lista de distribución Python-es