Obsługa wielu użytkowników w pythonie

Obsługa wielu użytkowników w pythonie
CG
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 3 lata
  • Postów:76
0

Hej
Mam pytanie dotyczące obsługi wielu zapytań wielu użytkowników w pythonie. (Pomijając kwestie wydajnościowe samego pythona)
Z tego co kojarzę, ostatnio w kwestii multiprocessingu czy też wielowątkowości w pythonie co nieco się pozmieniało.

Ogółem mam taki problem.
Program ma za zadanie odbierać dane z pewnego api. W zależności od danych uzyskanych z api - wiele podprocesów będzie wysyłać zapytania do innego api.
Zakładając, że mam bazę danych użytkowników. Każdy z użytkowników jest w stanie uruchomić swój oddzielny "proces". Im więcej użytkowników tym więcej równolegle uruchomionych procesów.

Czyli tak:

  1. jeden główny proces zbierający dane z pierwszego API i wyznaczający wynik analizy
  2. powiedzmy sto/tysiąc podprocesów, które w zależności od wyniku powyższej analizy wysyłają (w miarę równolegle) zapytanie do innego api. Częstotliwość wysyłanych zapytań nie będzie duża (powiedzmy co kilka dni) ale za to w jednym momencie wszyscy użytkownicy powinni być obsłużeni (w momencie zmiany wyniku analizy patrz 1.)

Jak to ugryźć?
Multiprocessing czy wielowątkowość? Jakieś biblioteki w pythonie? Na czym się skupić a co od razu odrzucić? Na początku chcę to zrobić w pythonie, w przyszłości pewnie ze względu na wydajność przejść na inny język.
Na ogółem nigdy nie robiłem tego nigdy a jak już coś robić to wolałbym zacząć od dobrych praktyk i uczyć się czegoś co ma sens :D
Wszelkie sugestie - zarówno co do języka jak i metod, bibliotek pythonowych ja najbardziej mile widziane.
Zapraszam do dyskusji - zakładam, że jest to zadanie które można rozwiązać w różny sposób :)

edytowany 2x, ostatnio: CzakuGim
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około godziny
  • Postów:4935
2

Do takiego procesu zdecydowanie wielowątkowość.
https://realpython.com/python-concurrency/


CG
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 3 lata
  • Postów:76
0

W międzyczasie trochę poczytałem również o GIL oraz threading.
Wpadłem też na ciekawy artykuł porównujący threading i asyncio:
GIL - koniec z katarem, weź asyncio
Z tego co rozumiem - nie warto zaczynać z threading - lepiej od razu poznać asyncio.
Jakieś komentarze dotyczące powyższego?

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około godziny
  • Postów:4935
1

Generalnie tak, chociaż acyncio jest około 30% szybsze od threading, ale bardziej skomplikowane; jak perfomance nie jest super kluczowy to sobie robię na ThreadPoolExecutor


CG
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 3 lata
  • Postów:76
0

W sumie jeszcze natknąłem się na takie podsumowanie:

Kopiuj
if io_bound:
    if io_very_slow:
        print("Use Asyncio")
    else:
        print("Use Threads")
else:
    print("Multi Processing")

No cóż, pozostaje mi to przetestować ;) Dzięki

JA
W tym kodzie jest prawda, bo gdy IO wolne, to nie ma co zapychać pulę wątków/dokładać procesów - trzeba czekać, więc warto asynca użyć. W przeciwnym wypadku może być wątek. A multiprocessing po to, aby GIL nie blokował :)
CG
Tylko co znaczy IO wolne? :D Zwykły request pobierający nie wiem, 50 bajtów klasyfikuje się już jako wolny?
JA
Nie kwalifikuje się, chyba, że na odpowiedź musiałbyś czekać z na przykład 10 s. Wyobraź sobie, że masz więcej takich wątków i każdy jest poblokowany przez oczekiwanie - dlatego nie jest tutaj polecany threading, tylko async :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.