🚀 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 Wed, 24 Feb 2010 13:26
Wielowątkowy dostęp do MySQL
#27322
Author: królewna
Date: Wed, 24 Feb 2010 13:26
17 lines
1652 bytes
Czy jeśli posiadam parę wątków, którym przez parametr przekazuje obiekt 
MySQLdb.connection i w każdym wątku tworzę nowy kursor to czy każdy 
kursor we wszystkich wątkach jest tym samym kursorem? Chodzi o to, że 
właśnie dodaje równolegle w paru wątkach informacje do bazy i jeśli nie 
użyję semaforów podczas dodawania do niej, to wywala mi błąd:

Traceback (most recent call last):
   File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
     self.run()
   File "/usr/lib/python2.6/threading.py", line 477, in run
     self.__target(*self.__args, **self.__kwargs)
   File "./savers/ping.py", line 26, in save
     db.commit()
OperationalError: (2013, 'Lost connection to MySQL server during query')

Pewnie jak zwykle popełniam głupi błąd ale mam nadzieję, że Panowie 
pomożecie.
Re: Wielowątkowy dostęp do MySQL
#27323
Author: Darek
Date: Wed, 24 Feb 2010 14:28
26 lines
2457 bytes
On 24 Lut, 14:26, królewna <krole...@ee.pl> wrote:
> Czy jeśli posiadam parę wątków, którym przez parametr przekazuje obiekt
> MySQLdb.connection i w każdym wątku tworzę nowy kursor to czy każdy
> kursor we wszystkich wątkach jest tym samym kursorem? Chodzi o to, że
> właśnie dodaje równolegle w paru wątkach informacje do bazy i jeśli nie
> użyję semaforów podczas dodawania do niej, to wywala mi błąd:
>
> Traceback (most recent call last):
>    File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
>      self.run()
>    File "/usr/lib/python2.6/threading.py", line 477, in run
>      self.__target(*self.__args, **self.__kwargs)
>    File "./savers/ping.py", line 26, in save
>      db.commit()
> OperationalError: (2013, 'Lost connection to MySQL server during query')
>
> Pewnie jak zwykle popełniam głupi błąd ale mam nadzieję, że Panowie
> pomożecie.

Po pierwsze: MySQL nie wspiera kursorów, sa one emulowane po stronie
drivera.
Po drugie: "The MySQL protocol can not handle multiple threads using
the same connection at once."

Rozwiązanie (najprostsze): Implementacja managera zarządzającego pólą
połączeń dla wątków (+cache)
Re: Wielowątkowy dostęp do MySQL
#27324
Author: Bart Ogryczak
Date: Wed, 24 Feb 2010 14:32
22 lines
2093 bytes
On Feb 24, 2:26 pm, królewna <krole...@ee.pl> wrote:
> Czy jeśli posiadam parę wątków, którym przez parametr przekazuje obiekt
> MySQLdb.connection i w każdym wątku tworzę nowy kursor to czy każdy
> kursor we wszystkich wątkach jest tym samym kursorem?

W MySQL nie ma kursorów[1], więc de facto w twoim przypadku kursor ==
połączenie.

> Chodzi o to, że
> właśnie dodaje równolegle w paru wątkach informacje do bazy i jeśli nie
> użyję semaforów podczas dodawania do niej,

Masz 3 wyjścia:
1) używać semaforów;
2) używać wielu połączeń (nieco bez sensu);
3) zrobić wątek, który będzie wykonywał zapytania asynchronicznie.
Czyli będziesz mu wrzucać zapytania do kolejki, on je wykona i zwróci
wynik do innej kolejki (albo callbackiem).


[1] ok, nie do końca prawda, kursory są, ale w procedurach i
wyzwalaczach. Czyli z punktu widzenia MySQLdb są bez znaczenia.
Re: Wielowątkowy dostęp do MySQL
#27325
Author: Darek
Date: Thu, 25 Feb 2010 08:55
4 lines
1483 bytes
On 24 Lut, 15:32, Bart Ogryczak <b.ogryc...@gmail.com> wrote:
> [1] ok, nie do końca prawda, kursory są, ale w procedurach i
> wyzwalaczach. Czyli z punktu widzenia MySQLdb są bez znaczenia.
True. Chodziło mi oczywiście o istotność dla drivera.
Re: Wielowątkowy dostęp do MySQL
#27326
Author: królewna
Date: Thu, 25 Feb 2010 09:52
12 lines
1570 bytes
W dniu 24.02.2010 15:32, Bart Ogryczak pisze:
>
> Masz 3 wyjścia:
> 1) używać semaforów;
> 2) używać wielu połączeń (nieco bez sensu);
> 3) zrobić wątek, który będzie wykonywał zapytania asynchronicznie.
> Czyli będziesz mu wrzucać zapytania do kolejki, on je wykona i zwróci
> wynik do innej kolejki (albo callbackiem).

No cóż czyli tak właściwie jedno połączenie == jeden "kursor". Wydawało 
mi się właśnie, że tak może być dlatego poleciałam semaforami. I chyba 
przy nich zostanę jako przy najprostszym rozwiązaniu.
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