Obsługa wielu użytkowników w pythonie

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 :)

2

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

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?

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

0

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1