Nous rencontrons beaucoup de tâches asynchrones dans le développement Web. Lorsque nous avons besoin d'opérations telles que :
Envoyer des emails
Envoi de requêtes à des API externes
Opérations mathématiques longues
Requêtes de base de données complexes
Notre application perd du temps à les exécuter et fait attendre l'utilisateur, ce qui peut affecter négativement son expérience utilisateur. Des files d'attente de tâches asynchrones existent pour résoudre ce problème.
Le céleri et ses problèmes
Le plus populaire pour le langage de programmation Python a longtemps été Celery . Il offre de grandes opportunités pour travailler avec des tâches, les lancer avec une période spécifique et les affiner.
Jusqu'à la sortie de Python 3.7, c'était presque le seul moyen d'implémenter le traitement des tâches asynchrones. Mais il est malheureusement aussi connu pour ses problèmes de compatibilité avec Python 3.7 et supérieur et le manque de support de Windows depuis Celery 4.
Et donc, pour tester votre application, il faut déployer Celery dans Docker ou passer sous Linux, ce qui est indésirable pour beaucoup.
Solution moderne - Dramatiq
Après avoir cherché des informations, j'ai trouvé une excellente alternative au céleri.
Dramatiq - Python 3, 2017 Celery.
If you’ve ever had to use Celery in anger, Dramatiq could be the tool for you.
- Celery, , Dramatiq .
Redis RabbitMQ
,
, Dramatiq . :
|
Dramatiq |
Celery |
RQ |
Python 2 |
|
|
|
Windows |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RabitMQ |
|
|
|
Redis |
|
|
|
Dramatiq
, Dramatiq !
, -, titles.txt. titles_scraper.py :
import requests
from bs4 import BeautifulSoup
def get_page_title(url):
soup = BeautifulSoup(requests.get(url).text, "html.parser")
file = open("titles.txt", "a")
file.write("\n"+soup.title.text)
get_page_title("example.com")
, , . , Dramatiq.
, :
import requests
from bs4 import BeautifulSoup
from dramatiq.brokers.redis import RedisBroker
import dramatiq
# Redis
dramatiq.set_broker(RedisBroker())
@dramatiq.actor
def get_page_title(url):
soup = BeautifulSoup(requests.get(url).text, "html.parser")
file = open("titles.txt", "a")
file.write("\n"+soup.title.text)
, , Dramatiq. Dramatiq , , .
:
dramatiq titles_scraper
Python :
>>> from titles_scraper import get_page_title
>>> get_page_title("https://google.com/") #
>>> get_page_title.send("https://google.com") # ,
>>> # Dramatiq
, titles.txt, google.com.
, Dramatiq, . , Dramatiq.
-
Django Flask:
Django, django-dramatiq. .
Flask, flask-dramatiq.
, Dramatiq .