[Python-es] problema con sqlite3 y hilos

Marcos Perez marcos.perez en rtve.es
Vie Ago 31 07:48:45 CEST 2012


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.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: 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. 
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20120831/2b277437/attachment.html>


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