Mam obecnie projekt o podobnych wymaganiach (po prostu bardziej skomplikowany ^^).
Nigdy nie odradza się podprocesu lub wątku z widoku Django. Nie masz kontroli nad procesami Django i może to być zabite, wstrzymane itp. Przed zakończeniem zadania. Jest kontrolowany przez serwer WWW (np. Apache przez WSGI).
Co chciałbym zrobić, to skrypt zewnętrzny, który działałby w osobnym procesie.Masz dwa rozwiązania, które moim zdaniem:
- Proces, który zawsze działa i indeksuje katalog, w którym umieszczasz pliki. Sprawdzałoby to na przykład katalog co dziesięć sekund i przetwarzało pliki
- To samo co powyżej, ale uruchamiane przez crona co x sekund. Zasadniczo ma taki sam efekt, jak
- Użyj Celery, aby utworzyć procesy robocze i dodać zadania do kolejki za pomocą aplikacji Django. Następnie musisz odzyskać wyniki za pomocą jednego ze środków dostępnych w Celery.
Teraz prawdopodobnie trzeba uzyskać dostęp do informacji w modelach Django na e-mail użytkownika w końcu. Tutaj masz kilka rozwiązań:
- importować moduły (modele itp) ze skryptu zewnętrznego
- Wdrożenie skryptu zewnętrznego jako polecenia niestandardowego (jak knutin sugerowane)
- przekazuje wyniki do aplikacji Django poprzez żądanie POST na przykład. Następnie wykonasz wysyłanie wiadomości e-mail i zmiany statusu itp. W normalnym widoku Django.
Chciałbym wybrać proces zewnętrzny i zaimportować moduły lub żądanie POST. W ten sposób jest znacznie bardziej elastyczny. Można na przykład wykorzystać moduł przetwarzania wieloprocesowego do przetworzenia kilku plików w tym samym czasie (dzięki temu wydajnie wykorzystując maszyny wielordzeniowe).
Podstawowy przepływ pracy będzie:
- Sprawdź katalog dla nowych plików
- Dla każdego pliku (może być parallelized):
- Process
- Wyślij e-mail lub zawiadomić aplikację Django
- Spij przez chwilę
Mój projekt zawiera naprawdę wymagające procesora przetwarzanie. Obecnie korzystam z zewnętrznego procesu, który nadaje zadania przetwarzania do puli procesów roboczych (w zasadzie to, co może zrobić dla ciebie Celery) i raportuje postępy i wyniki z powrotem do aplikacji Django za pośrednictwem żądań POST. Działa bardzo dobrze i jest względnie skalowalny, ale wkrótce go zmienię, aby używać Selera w klastrze.
co jeśli wystąpi jakiś błąd, podczas przetwarzania danych? –
Wyślę im e-mail na ten temat. Nie mogę oczekiwać, że będą czekać na stronie, dopóki jej nie skończę, ponieważ może to trwać 20 minut lub dłużej. – FunLovinCoder