🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
5 messages
5 total messages Started by królewna Thu, 18 Mar 2010 11:02
sqlite3, baza w pamięci i wielowątkowość
#27385
Author: królewna
Date: Thu, 18 Mar 2010 11:02
24 lines
1982 bytes
Mam problem, gdyż chciałabym użyć tablicy, która mieści się w pamięci 
(definicja przez sqlite3.connect(":memory:") ) i nie wiem jak sprawić 
aby ta sama baza była widziana w różnych wątkach. Jeśli chcę to samo 
zrobić z bazą w pliku to nie ma problemu.

Nie mogę przekazać obiektu connection ani cursor gdyż wyskakuje mi

ProgrammingError: SQLite objects created in a thread can only be used in 
that same thread.The object was created in thread id -1219066176 and 
this is thread id -1224475792

jeśli natomiast otwieram różne połączenia to de facto podłączam się do 
różnych baz. Czy w takim razie najlepszym rozwiązaniem jest napisanie 
jakiegoś wrappera na dostęp do bazy? Nie ma prostszej metody?

U mnie jest jeszcze prosta sytuacja gdyż wątki są tworzone w ramach 
jednego programu (więc można ewentualnie stowrzyć właśnie taki wrapper) 
jednak co jeśli dwa oddzielne programy chciałyby mieć dostęp do tej 
samej bazy sqlite rezydującej w pamięci? Należałoby wtedy stworzyć nowy 
proces, który by tylko służył za pośrednika dostępu do bazy?

--
pozdrawiam
królewna
Re: sqlite3, baza w pamięci i wielowątkowość
#27386
Author: Piotr Husiatynski
Date: Thu, 18 Mar 2010 18:30
28 lines
2346 bytes
Dnia 18.03.2010 królewna <królewna@ee.pl> napisał/a:
> Mam problem, gdyż chciałabym użyć tablicy, która mieści się w pamięci 
> (definicja przez sqlite3.connect(":memory:") ) i nie wiem jak sprawić 
> aby ta sama baza była widziana w różnych wątkach. Jeśli chcę to samo 
> zrobić z bazą w pliku to nie ma problemu.
>
> Nie mogę przekazać obiektu connection ani cursor gdyż wyskakuje mi
>
> ProgrammingError: SQLite objects created in a thread can only be used in 
> that same thread.The object was created in thread id -1219066176 and 
> this is thread id -1224475792
>
> jeśli natomiast otwieram różne połączenia to de facto podłączam się do 
> różnych baz. Czy w takim razie najlepszym rozwiązaniem jest napisanie 
> jakiegoś wrappera na dostęp do bazy? Nie ma prostszej metody?
>
> U mnie jest jeszcze prosta sytuacja gdyż wątki są tworzone w ramach 
> jednego programu (więc można ewentualnie stowrzyć właśnie taki wrapper) 
> jednak co jeśli dwa oddzielne programy chciałyby mieć dostęp do tej 
> samej bazy sqlite rezydującej w pamięci? Należałoby wtedy stworzyć nowy 
> proces, który by tylko służył za pośrednika dostępu do bazy?

SQLite jest na tyle "inteligentne", żeby nie pozwolić na ściganie się wątków w
zapisie do bazy. Rozwiązanie jest takie, żeby robić to tylko z głównego wątku.

Dlaczego wątki w pythonie?
-- 
Piotr Husiatyński
Re: sqlite3, baza w pamięci i wielowątkowość
#27387
Author: królewna
Date: Fri, 19 Mar 2010 10:51
31 lines
2222 bytes
W dniu 18.03.2010 19:30, Piotr Husiatynski pisze:
>
> SQLite jest na tyle "inteligentne", żeby nie pozwolić na ściganie się wątków w
> zapisie do bazy. Rozwiązanie jest takie, żeby robić to tylko z głównego wątku.

Więc jak mam rozumieć deklarację:
http://www.sqlite.org/faq.html#q5

Nie chodzi o zapis do bazy. Chodzi o jakiekolwiek odniesienie do bazy. 
Nie mogę przesłać do wątku ani połączenia do bazy ani kursora na tej 
bazie. Po prostu nie mogę przesłać do wątku żadnego obiektu klasy 
sqlite3.* Jak już wspominałam to nie byłoby problemem gdybym mogła w tym 
wątku podłączyć się do tej samej bazy ale polecenie 
sqlite3.connect(":memory:") podłącza mnie do zupełnie innej bazy w 
pamięci (problem ten nie występuję jeśli podłączam się do bazy w pliku).

A więc:
1. Mogę stworzyć tylko jedno połączenie do bazy w pamięci (bo inne będą 
się odnosić do innych baz)
2. Nie mogę przesłać żadnych referencji do tej bazy poza wątek, w którym 
stworzyłam połączenie.

Jeśli ktoś rozwiąże choć jedną przeszkodę to rozwiąże mój problem.

> Dlaczego wątki w pythonie?

Bo nadają się idealnie do tego co robię.

--
pozdrawiam
królewna
Re: sqlite3, baza w pamięci i wielowątkowość
#27388
Author: Bart Ogryczak
Date: Fri, 19 Mar 2010 13:45
19 lines
2327 bytes
On Mar 19, 11:51 am, królewna <króle...@ee.pl> wrote:
> W dniu 18.03.2010 19:30, Piotr Husiatynski pisze:
>
>
>
> > SQLite jest na tyle "inteligentne", żeby nie pozwolić na ściganie się wątków w
> > zapisie do bazy. Rozwiązanie jest takie, żeby robić to tylko z głównego wątku.
>
> Więc jak mam rozumieć deklarację:http://www.sqlite.org/faq.html#q5
>
> Nie chodzi o zapis do bazy. Chodzi o jakiekolwiek odniesienie do bazy.
> Nie mogę przesłać do wątku ani połączenia do bazy ani kursora na tej
> bazie. Po prostu nie mogę przesłać do wątku żadnego obiektu klasy
> sqlite3.* Jak już wspominałam to nie byłoby problemem gdybym mogła w tym
> wątku podłączyć się do tej samej bazy ale polecenie
> sqlite3.connect(":memory:") podłącza mnie do zupełnie innej bazy w
> pamięci (problem ten nie występuję jeśli podłączam się do bazy w pliku).

Zrób bazę na tmpfs i po problemie.
Re: sqlite3, baza w pamięci i wielowątkowość
#27389
Author: królewna
Date: Fri, 19 Mar 2010 13:53
16 lines
1561 bytes
ZNALAZŁAM!!!

Cała sztuczka sprowadza się do dodania nazwanego parametru w
połączeniu. Wystarczy dać:

sqlite3.connection(":memory:", check_same_thread = False)

a błąd zniknie i można przekazać połączenie do innego wątku i stworzyć 
kursor. Od tej pory jednak jesteśmy zdani na siebie jeśli chodzi o 
kontrolę dostępu do bd.

Jestem naładowana pozytywną energią na cały nadchodzący weekend :D

--
pozdrawiam
królewna
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads