Ciągle napotykam na dziwne problemy mysql, podczas gdy pracownicy wykonują zadania zaraz po utworzeniu.Tworzenie oddzielnego połączenia z bazą danych dla każdego pracownika selera
Używamy Django 1.3, seler 3.1.17, djorm-ext-pool 0,5
Rozpoczynamy proces selera z współbieżności 3. Moja obeservation tak daleko jest, gdy proces początek robotnicy, wszyscy dostają takie same mysql połączenie. Logujemy identyfikator połączenia db, jak poniżej.
from django.db import connection
connection.cursor()
logger.info("Task %s processing with db connection %s", str(task_id), str(connection.connection.thread_id()))
Kiedy wszyscy pracownicy dostają zadania, pierwszy wykonuje z powodzeniem, ale pozostałe dwa daje dziwne błędy MySQL. To albo błędy z "odszedł serwer Mysql", albo z warunkiem, w którym Django zgłasza błąd "DoesNotExist". w oczywisty sposób istnieją obiekty, których zapytania Django istnieją.
Po tym błędzie każdy pracownik zaczyna uzyskiwać własne połączenie z bazą danych, po czym nie znajduje się żaden problem.
Jakie jest domyślne zachowanie selerów? Jest przeznaczony do udostępniania tego samego połączenia z bazą danych. Jeśli tak, to w jaki sposób odbywa się komunikacja między procesami? Idealnie wolałbym różne połączenia z bazą danych dla każdego pracownika.
Próbowałem kodu, o którym mowa poniżej, który nie działał. Celery Worker Database Connection Pooling
Poprawiliśmy także sugerowany poniżej kod selera. https://github.com/celery/celery/issues/2453
Dla tych, którzy zgodzili się na to pytanie, uprzejmie daj mi znać powód do spadku.
Czy używasz oprogramowania pośredniego do łączenia puli Django? Jaka jest twoja konfiguracja CONN_MAX_AGE w konfiguracji django? Myślę, że to powoduje trwałe zachowanie połączenia w django. Może to być związane z zachowaniem, które widzisz, a nie z samym selerem. –
Czy możesz po prostu uruchomić współbieżność = 1 i uruchomić wielu pracowników? –
@AlexLuisArias Który uruchamiałby tylko jeden proces roboczy i nie dotyczy tego problemu. –