Nos encontramos con muchas tareas asincrónicas en el desarrollo web. Cuando necesitamos operaciones como:
Mandando correos electrónicos
Envío de solicitudes a API externas
Operaciones matemáticas largas
Consultas complejas de bases de datos
Nuestra aplicación pierde tiempo ejecutándolos y hace esperar al usuario, lo que puede afectar negativamente su experiencia de usuario. Existen colas de tareas asincrónicas para resolver este problema.
Apio y sus problemas
El más popular para el lenguaje de programación Python ha sido durante mucho tiempo Celery . Brinda grandes oportunidades para trabajar con tareas, lanzarlas con un período específico y perfeccionarlas.
Hasta que se lanzó Python 3.7, era casi la única forma de implementar el procesamiento de tareas asincrónicas. Pero, desafortunadamente, también es conocido por sus problemas de compatibilidad con Python 3.7 y superior y la falta de soporte de Windows desde Celery 4.
Y, por lo tanto, para probar su aplicación, debe implementar Celery en Docker o cambiar a Linux, lo cual es indeseable para muchos.
Solución moderna - Dramatiq
Después de buscar información, encontré una excelente alternativa al apio.
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 .